设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 7472|回复: 3
打印 上一主题 下一主题

模拟登录豆瓣

[复制链接]

1

主题

0

好友

41

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2013-12-12 18:59:09 |只看该作者 |倒序浏览
模拟登陆豆瓣的一段代码,登陆后可以发广播,小组回帖(回复首页回复数为0的帖子)和发豆油功能,也是边学边写的,代码写得很烂,很多东西也没考虑,只是实现了这么一个过程吧,又需要的可以参考一下。
  1. # -*- coding:utf-8 -*-
  2. # author: guagua
  3. # date:2013.12.12

  4. import urllib
  5. import urllib2
  6. import re
  7. import cookielib
  8. import time
  9. import random
  10. import threading

  11. class LoginDouban(object):
  12.         """docstring for ClassName"""
  13.         def __init__(self, email, password):
  14.                 #super(ClassName, self).__init__()
  15.                 #self.response = response
  16.                 self.url = 'http://www.douban.com/accounts/login'
  17.                 #保存cookie
  18.                 cookie = cookielib.CookieJar()
  19.                 self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
  20.                 #登录post字典参数
  21.                 self.data = {
  22.                                 "form_email":email,
  23.                                 "form_password":password,
  24.                                 "source":"index_nav"
  25.                 }
  26.                 #post headers
  27.                 head = {
  28.                         "Connection":'keep-alive',
  29.                         "HOST":'www.douban.com',
  30.                         "Referer":'http://www.baidu.com/',
  31.                         "User_Agent":'Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0'
  32.                 }

  33.                 req = urllib2.Request(self.url)
  34.                 #request添加headers
  35.                 for  item in head:
  36.                         req.add_header(item, head[item])

  37.                 self.response = self.opener.open(req, urllib.urlencode(self.data))

  38.         '''登录豆瓣'''
  39.         def login_douban(self):
  40.                 if self.response.geturl() == self.url:
  41.                     html = self.response.read()

  42.                     regex = re.compile(r'<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>')
  43.                     imgurl = regex.findall(html)

  44.                     res = urllib.urlretrieve(imgurl[0], 'gg.jpg')
  45.                     #获取captcha-id参数
  46.                     captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>' ,html)
  47.                     if captcha:
  48.                         vcode=raw_input('请输入图片上的验证码:')
  49.                         self.data["captcha-solution"] = vcode
  50.                         self.data["captcha-id"] = captcha.group(1)
  51.                         self.data["user_login"] = "登录"
  52.                         #验证码
  53.                         self.response = self.opener.open(self.url, urllib.urlencode(self.data))
  54.                         #登录成功
  55.                         if self.response.geturl() == "http://www.douban.com/":
  56.                             print 'login success !'
  57.                 html = self.response.read()
  58.                 self.ckcode = re.findall(r'<a href="http://www.douban.com/accounts/logout\?.+ck=(.*?)">', html)

  59.         '''发豆瓣广播'''
  60.         def post_douban(self):
  61.                 html = self.response.read()
  62.                 ckcode = re.findall(r'<a href="http://www.douban.com/accounts/logout\?.+ck=(.*?)">', html)
  63.                 content = raw_input("我说:")
  64.                 dic = {
  65.                         "ck":ckcode[0],
  66.                         "comment":content
  67.                 }
  68.                 self.response = self.opener.open("http://www.douban.com/?", urllib.urlencode(dic))
  69.                 if self.response.geturl() == "http://www.douban.com/":
  70.                     print 'post success !'


  71.         '''小组话题抢沙发'''
  72.         def sofa(self):
  73.                 self.response = self.opener.open("http://www.douban.com/group/hangzhou/#topics")
  74.                   
  75.                 topicid_and_count = re.findall(r'topic/(\d+?)/.*?class="">.*?<td nowrap="nowrap" class="">(.*?)</td>', html, re.DOTALL)
  76.                 #发帖信息
  77.                 replays = ['哦', '呵呵', '@@', '沙发']

  78.                 topics = {
  79.                         "ck":self.ckcode[0],
  80.                         "rv_comment":random.choice(replays),
  81.                         "start":"0",
  82.                         "submit_btn":"加上去"
  83.                 }

  84.                 for item in topicid_and_count:
  85.                         if item[1] == '':
  86.                                 self.opener.open("http://www.douban.com/group/topic/" + item[0] + "/add_comment#last?", urllib.urlencode(topics))

  87.         '''发豆油'''
  88.         def send_douyou(self):
  89.                 #豆瓣ID为数字,在你的主页能看到
  90.                 ID = raw_input("Input your douban ID:")
  91.                 self.response = self.opener.open("http://www.douban.com/doumail/write?to=" + ID)
  92.                
  93.                 douyou_dic = {
  94.                         "ck":self.ckcode[0],
  95.                         "m_submit":"好了,寄出去",
  96.                         "m_text":"嘿,你好。",
  97.                         "to":ID
  98.                 }

  99.                 self.opener.open("http://www.douban.com/doumail/write?", urllib.urlencode(douyou_dic))


  100. '''
  101. 增加多线程模块
  102. '''

  103. class MyThread(threading.Thread):
  104.         def __init__(self, email, password):
  105.                 super(MyThread, self).__init__()

  106.         def run():
  107.                 m = LoginDouban(self.email, self.password)
  108.                 m.login_douban()
  109.                 m.send_douyou()


  110. def main():
  111.         email = raw_input("Email:")
  112.         password = raw_input("Password:")
  113.         mt = MyThread(email, password)
  114.         mt.start()
  115.         mt.join()

  116. if __name__ == '__main__':
  117.         main()
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2013-12-12 23:05:23 |只看该作者
这个好!昨天还遇到一个人向我问模拟登录的方法
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

103

积分

注册会员

Rank: 2

板凳
发表于 2013-12-12 23:26:10 |只看该作者
本帖最后由 ZJUMonster 于 2013-12-12 23:30 编辑

问个跟主题无关的问题,话说怎么在帖子中贴出lz这种带行数的代码的格式
-------------------------------------------------------------------------------------------------------
已经发现了,谢谢lz的分享。。。
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

地板
发表于 2015-7-25 23:50:00 |只看该作者
记下了 ,谢谢!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-19 07:32 , Processed in 0.017937 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部