设为首页 收藏本站
查看: 769|回复: 0

[经验分享] Python代码登录新浪微博并自动发微博

[复制链接]
发表于 2015-11-29 08:06:19 | 显示全部楼层 |阅读模式
前言
  对于很少玩微博@張行之_的我来说,微博内容少的可怜。所以本人就想:能不能写个成功程序来帮我发微博。这个程序要满足以下要求:


  • 自动化,自动登录微博,自动发微博。  

  • 微博内容要有意义,不能是随机生成的字符。  

  • 可以设置每隔一段时间发一条微博,频率不能太快,当然也不能太慢。
  于是,就诞生了这个程序,代码使用纯Python实现,没有使用微博SDK,主要是模拟HTTP操作。程序运行后会先登录微博,然后启动一个定时器,每隔一段时间爬取秒拍、cnBeta、博客园、TechWeb、推酷最新的内容,再转发到微博。
  代码托管在GitHub上,项目地址:https://github.com/zchlong/sinaWeibo.git
  试用了几天,效果可以查看我的微博:@張行之_。

整体结构
  程序分为3个模块:微博登录定时发微博微博内容生产。代码结构如下:
  

sinaWeibo  
|----main.py
  
|----sinaWeiboLogin.py
  
|----config.py
  
|----logger.py
  
|----sendWeibo.py
  
|----TextFactory.py
  |spider
  |----__init__.py
  |----utility.py
  |----http.py
  |----spider.py
  |----cnbeta.py          //解析cbbeta
  |----cnblog.py          //解析博客园
  |----techweb.py       /解析techweb
  |----tuicool.py          //解析推酷
  |----.....                      //更多解析
  

使用
  如果你只想使用该代码来发微博,并不关心代码是怎么实现的,那么你只需要读这一节内容。


  • 下载,项目地址:https://github.com/zchlong/sinaWeibo.git。  

  • 修改配置文件config.py,把微博账号和密码改为你自己的,还可以设置发送时间(默认是30分钟一次)。  

  • 在TextFactory.py可以设置微博内容生成规则,也可以使用默认的规则。  

  • 运行main.py,python main.py。
  注意:


  • 该代码使用了代码依赖requests和rsa,没有安装的话需要先安装:
  

pip install rsa  
pip install requests
  


  • 如果你的微博登录时要输入验证码,该代码是登录不成功的,可以在账号安全的登录保护中设置不输入验证码。
登录
  登录网上有很多现成的方法,在GitHub上找到一个登录新浪微博的Python代码,使用requests,比urllib2更方便。代码依赖requests和rsa。代码有点旧,需要做一点修改。
  

WBCLIENT = 'ssologin.js(v1.4.5)' => WBCLIENT = 'ssologin.js(v1.4.18)'  

  两个正则表达式也需要修改下:
  

login_url = re.search(r'replace\([\"\']([^\'\"]+)[\"\']', resp.text).group(1)  
改为:
  
login_url = re.search('replace\\(\'([^\']+)\'\\)', resp.text).group(1)
  

  
login_str = re.match(r'[^{]+({.+?}})', resp.text).group(1)
  
改为:
  
login_str = login_str = re.search('\((\{.*\})\)', resp.text).group(1)
  

  登录时要注意,如果需要输入验证码,这段代码是会登录失败的,可以在账号安全的登录保护中设置不输入验证码。

定时自动发微博
  新浪微博发微博的接口是:
  http://www.weibo.com/aj/mblog/add?ajwvr=6&__rnd=时间戳
  时间戳使用int(time.time() * 1000即可设置。
  Post提交数据:
  

"location" : "v6_content_home",  
"appkey" : "",
  
"style_type" : "1",
  
"pic_id" : "",
  
"text" : 微博内容,
  
"pdetail" : "",
  
"rank" : "0",
  
"rankid" : "",
  
"module" : "stissue",
  
"pub_type" : "dialog",
  
"_t" : "0",
  

  提交数据时需要设置Headers:
  self.http.headers["Referer"] = "http://www.weibo.com/u/%s/home?wvr=5" % str(self.uid)
  uid在登录时会返回。
  在Python中启动一个定时器(Timer),每当定时器触发的时候向这个接口Post数据就能实现自动发微博了。
  

def newTimer(self):  self.timer = Timer(TIME_SLOG, self.main, ()).start()
  

  
def stop(self):
  log("结束任务")
  self.timer.cancel()
  pass
  

  
def main(self):
  self.sendWeibo()
  

  if TIMER_REPEAT:
  self.newTimer()
  

  
def sendWeibo(self):
  text = TextFactory.getText()
  self.update(text)
  log(u"发送微博:" + text)
  

微博内容生产
  要产生有意义的微博内容,一般需要从网站上爬取。当然,也可以把内容写入文本再定时发送。内容都是从网上爬取的,因此需要实现一个爬虫,用Python的requests爬取网页非常方便,几行代码搞定。使用SGMLParser解析网页也是非常方便的。爬虫部分在爬取网页都是一样的,解析时不同,所以只需要分别对每一个网站实现一个SGMLParser子类就能实现多个网站的爬取了。
  为了从不同网站爬取数据,代码实现一个轮询机制,用一个容器保存各个网站的爬虫对象,在每次获取微博内容时使用不同的爬虫对象。
  

spiders = [  Spider(miaopai.HOME_URL, miaopai.MiaopaParser()),
  Spider(cnbeta.HOME_URL, cnbeta.CnbetaParser()),
  Spider(cnblog.HOME_URL, cnblog.CnblogParser()),
  Spider(techweb.HOME_URL, techweb.TechwebParser()),
  Spider(tuicool.HOME_URL, tuicool.TuicoolParser()),
  Spider(miaopai.HOME_URL, miaopai.MiaopaParser()),
  
]
  

  
currentIndex = 0
  
count = len(spiders)
  

  
def getText():
  spider = nextSpider()
  text = spider.getAMessage()
  return text
  

  
def nextSpider():
  global currentIndex
  spider = spiders[currentIndex]
  currentIndex = (currentIndex + 1) % count
  return spider
  

添加爬虫
  代码设计具有较好地扩展性,在爬虫类spder.py中定义一个解析属性
  

class Spider(object):  def __init__(self, homeUrl, parser):
  super(Spider, self).__init__()
  self.homeUrl = homeUrl
  self.parser = parser
  

  def getAMessage(self):
  html = http.get(self.homeUrl)
  self.parser.feed(html)
  return self.parser.getMsg()
  

  在创建Spider对象时,只需要注入不同的解析对象,就能解析不同的网站内容了,甚至还可实现从其他渠道获取内容。
  在TextFactory.py中实现了轮询机制,当有新的解析类时,只需在TextFactory.py中的spiders添加一个就行。

结语
  该代码已经基本满足了前言的3点要求,不过还存在一些问题:


  • 爬虫部分还存在很多冗余,可以进一步优化。  

  • 产生微博内容时可能会生成相同的内容,尤其是目标网站更新频率不高时。
  代码托管在码托管在GitHub上,项目地址:https://github.com/zchlong/sinaWeibo.git。
  本文最早发表于: http://zh.5long.me
  原文链接: http://zh.5long.me/2015/code-login-sina-weibo-update-weibo/
  版权声明:自由转载-非商用-保持署名  | Creative Commons BY-NC 4.0

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144753-1-1.html 上篇帖子: [Python]同是新手的我,分享一些经验 下篇帖子: [Python] 网络爬虫和正则表达式学习总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表