Python简单实现微博自动点赞

发布于 2022-08-18 09:54:07 1.9K0 举报 文章被收录于专栏:毛利学Python 觉得微博手动点赞太过麻烦?其实自动点赞的实现并不困难! 本篇会有Cookie、session和token方面的知识,不太了解的可以先看下 我们先通过前两个小节大概了解一下我们Python登录微博的原理,然后第三小节就会跟大家介绍微博自动点赞的代码。

目录


一、实现登陆微博功能

首先进入后按F12打开开发者工具,将如图的按钮点击后,在浏览器中手动登陆一次,在Network 标签的XHR类型中找到Login请求标签,在Form data下我们可以看到username(用户名)和password(密码),并知道了请求方式是POST,请求的参数有很多我们直接照搬就是。

「网页截图↓」

自媒体-点赞 - 图1

这时,可能学过一些爬虫的同学便会直接上手写出如上雷同的代码,但发现出不来结果

「会报错的代码↓」

代码语言:javascript

复制

  1. import requests
  2. headers = {<!-- -->
  3. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
  4. }
  5. login_data = {<!-- -->
  6. 'username': '你的用户名',
  7. 'password': '你的密码',
  8. 'savestate': '1',
  9. 'r': 'https://m.weibo.cn/?jumpfrom=weibocom',
  10. 'ec': '0',
  11. 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
  12. 'entry': 'mweibo',
  13. 'wentry': '',
  14. 'loginfrom': '',
  15. 'client_id': '',
  16. 'code': '',
  17. 'qq': '',
  18. 'mainpageflag': '1',
  19. 'hff': '',
  20. 'hfp': '',
  21. }
  22. login_req = requests.post('https://passport.weibo.cn/sso/login', data=login_data, headers=headers)
  23. print(login_req.status_code)
这是因为有些网站并不只是按照’user-agent’判断用户的正常访问的。那我们还需点开Request Headers(请求头)检查可能还有什么字段会用来判断用户正常访问

自媒体-点赞 - 图2

一般 referer(请求来源页面)、origin(谁发起的请求)、host(主机名及端口号) 字段也常被用于反爬虫,当我们的爬虫无法正常获取数据时,我们可以将请求头里的这些字段照搬进去试试。经过验证,微博网页是以referer 来判断是否是用户正常访问。最后我们还可以把Cookie放进代码里,这样就不用在代码里输入账号密码了。 要注意Cookie并不是永久有效的,若发现自动登录失败,可以重新上网页把新的Cookie复制下来更换

「完整的代码如下↓」

代码语言:javascript

复制

  1. import requests
  2. headers = {<!-- -->
  3. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
  4. 'referer': 'https://passport.weibo.cn/signin/login? entry=mweibo&amp;res=wel&amp;wm=3349&amp;r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
  5. 'cookie': '你的cookie'
  6. }
  7. login_data = {<!-- -->
  8. 'savestate': '1',
  9. 'r': 'https://m.weibo.cn/?jumpfrom=weibocom',
  10. 'ec': '0',
  11. 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
  12. 'entry': 'mweibo',
  13. 'wentry': '',
  14. 'loginfrom': '',
  15. 'client_id': '',
  16. 'code': '',
  17. 'qq': '',
  18. 'mainpageflag': '1',
  19. 'hff': '',
  20. 'hfp': '',
  21. }
  22. login_req = requests.post('https://passport.weibo.cn/sso/login', data=login_data, headers=headers)
  23. print(login_req.status_code) #输出200则代表登录成功

二、实现发送微博

既然都登陆微博了,我们先试试能不能顺便发微博吧 同样的,在微博编辑页面点击F12进入开发者工具,我们先试试发送一个微博,Network标签会出现什么新的内容吧

「网页截图↓」

自媒体-点赞 - 图3

自媒体-点赞 - 图4

当微博界面点击发送之后,Network标签就会出现update的请求,点进去可以看到,请求地址是https://m.weibo.cn/api/statuses/update,请求方法是 POST。参数有两个一个是content 也就是发送的微博内容,另一个是st,这里的st通过几次的检验,猜测应该是网站的反爬虫措施。这里获得st的方法是通过同为Network标签下的config请求,里面存放了st值,我们将 JSON 格式的字符串转换为字典,然后取到 st 的值

「方法↓」

代码语言:javascript

复制

  1. config_req = session.get('https://m.weibo.cn/api/config')
  2. config = config_req.json()
  3. st = config['data']['st']
  4. print(st) #每隔一段时间st值会改变

「登录和发送微博的完整代码如↓」

代码语言:javascript

复制

  1. import requests
  2. headers = {<!-- -->
  3. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
  4. 'referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&amp;res=wel&amp;wm=3349&amp;r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
  5. 'cookie': '你的cookie'
  6. }
  7. login_data = {<!-- -->
  8. 'savestate': '1',
  9. 'r': 'https://m.weibo.cn/?jumpfrom=weibocom',
  10. 'ec': '0',
  11. 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
  12. 'entry': 'mweibo',
  13. 'wentry': '',
  14. 'loginfrom': '',
  15. 'client_id': '',
  16. 'code': '',
  17. 'qq': '',
  18. 'mainpageflag': '1',
  19. 'hff': '',
  20. 'hfp': '',
  21. }
  22. # 使用 session来保留登录状态
  23. session = requests.Session()
  24. session.headers.update(headers)
  25. login_req = session.post('https://passport.weibo.cn/sso/login', data=login_data)
  26. # 获取 st 请求
  27. config_req = session.get('https://m.weibo.cn/api/config')
  28. config = config_req.json()
  29. st = config['data']['st']
  30. compose_data = {<!-- -->
  31. 'content': input("请输入发送的内容:"),,
  32. 'st': st
  33. }
  34. compose_req = session.post('https://m.weibo.cn/api/statuses/update', data=compose_data)
  35. print(compose_req.json()) # 输出:{<!-- -->'ok': 1, 'data': 省略部分内容...}

「调整结构后的代码(功能一样)如↓」

代码语言:javascript

复制

  1. import requests
  2. class WeiboSpider:
  3. def __init__(self):
  4. self.session = requests.Session()
  5. self.headers = {<!-- -->
  6. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
  7. 'referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&amp;res=wel&amp;wm=3349&amp;r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
  8. 'cookie': '你的Cookie'
  9. }
  10. self.session.headers.update(self.headers)
  11. def login(self):
  12. login_data = {<!-- -->
  13. 'savestate': '1',
  14. 'r': 'https://m.weibo.cn/?jumpfrom=weibocom',
  15. 'ec': '0',
  16. 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
  17. 'entry': 'mweibo',
  18. 'wentry': '',
  19. 'loginfrom': '',
  20. 'client_id': '',
  21. 'code': '',
  22. 'qq': '',
  23. 'mainpageflag': '1',
  24. 'hff': '',
  25. 'hfp': '',
  26. }
  27. self.session.post('https://passport.weibo.cn/sso/login', data=login_data)
  28. def get_st(self):
  29. config_req = self.session.get('https://m.weibo.cn/api/config')
  30. config = config_req.json()
  31. st = config['data']['st']
  32. return st
  33. def compose(self, content):
  34. compose_data = {<!-- -->
  35. 'content': content,
  36. 'st': self.get_st()
  37. }
  38. compose_req = self.session.post('https://m.weibo.cn/api/statuses/update', data=compose_data)
  39. print(compose_req.json())
  40. def send(self, content):
  41. self.login()
  42. self.compose(content)
  43. weibo = WeiboSpider()
  44. weibo.send(input("请输入发送的内容:"))

三、实现微博自动点赞

完整的代码↓

代码语言:javascript

复制

  1. import requests
  2. class WeiboSpider:
  3. def __init__(self):
  4. self.session = requests.Session()
  5. self.headers = {<!-- -->
  6. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
  7. 'referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&amp;res=wel&amp;wm=3349&amp;r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
  8. 'cookie': '你的cookie'
  9. }
  10. self.session.headers.update(self.headers)
  11. def login(self):
  12. login_data = {<!-- -->
  13. 'savestate': '1',
  14. 'r': 'https://m.weibo.cn/?jumpfrom=weibocom',
  15. 'ec': '0',
  16. 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
  17. 'entry': 'mweibo',
  18. 'wentry': '',
  19. 'loginfrom': '',
  20. 'client_id': '',
  21. 'code': '',
  22. 'qq': '',
  23. 'mainpageflag': '1',
  24. 'hff': '',
  25. 'hfp': '',
  26. }
  27. self.session.post('https://passport.weibo.cn/sso/login', data=login_data)
  28. def get_st(self):
  29. config_req = self.session.get('https://m.weibo.cn/api/config')
  30. config = config_req.json()
  31. st = config['data']['st']
  32. return st
  33. def compose(self, content):
  34. compose_data = {<!-- -->
  35. 'content': content,
  36. 'st': self.get_st()
  37. }
  38. compose_req = self.session.post('https://m.weibo.cn/api/statuses/update', data=compose_data)
  39. print(compose_req.json())
  40. def send(self, content):
  41. self.login()
  42. self.compose(content)
  43. # 获取微博列表
  44. def get_weibo_list(self):
  45. params = {<!-- -->
  46. 'type': 'uid',
  47. 'value': '2139359753',
  48. 'containerid': '1076032139359753'
  49. }
  50. weibo_list_req = self.session.get('https://m.weibo.cn/api/container/getIndex', params=params)
  51. weibo_list_data = weibo_list_req.json()
  52. weibo_list = weibo_list_data['data']['cards']
  53. return weibo_list
  54. # 点赞微博
  55. def vote_up(self, id):
  56. vote_up_data = {<!-- -->
  57. 'id': id, # 要点赞的微博 id
  58. 'attitude': 'heart',
  59. 'st': self.get_st()
  60. }
  61. vote_up_req = self.session.post('https://m.weibo.cn/api/attitudes/create', data=vote_up_data)
  62. json = vote_up_req.json()
  63. print(json['msg'])
  64. # 批量点赞微博
  65. def vote_up_all(self):
  66. self.login()
  67. weibo_list = self.get_weibo_list()
  68. for i in weibo_list:
  69. # card_type 9 是正常微博
  70. if i['card_type'] == 9:
  71. self.vote_up(i['mblog']['id'])
  72. weibo = WeiboSpider()
  73. weibo.vote_up_all()
谢谢大家,Python的分享就到此为止,以后如果有好玩的Python程序,我还会继续向大家分享的