原文链接

前景提要

最近发现有人QQ空间对我展开了屏蔽,咱们也不知道怎么惹到人家了,一气之下写了一个小爬虫看看到底谁把我屏蔽了。写小本本记下来!!!
代码在最尾部,需要请自取。

准备工作

  1. python环境:
  2. python3.7.4
  3. 第三方库环境:
  4. requests
  5. lxml
  6. threadpool
  7. selenium

利用selenium模拟登陆获取cookie并保存到本地

  1. def search_cookie(): # 先检测一下是否运行过
  2. if not __import__('os').path.exists('cookie_dict.txt'):
  3. get_cookie_json()
  4. with open('cookie_dict.txt', 'r') as f:
  5. cookie=json.load(f)
  6. return cookie
  7. def get_cookie_json(): # 无头selenium登陆
  8. qq_number = input('请输入qq号:')
  9. password = __import__('getpass').getpass('请输入qq密码:')
  10. from selenium import webdriver
  11. login_url = 'https://i.qq.com/'
  12. chrome_options =Options()
  13. chrome_options.add_argument('--headless')
  14. driver = webdriver.Chrome(options=chrome_options)
  15. driver.get(login_url)
  16. driver.switch_to_frame('login_frame')
  17. driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
  18. time.sleep(1)
  19. driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq_number)
  20. driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
  21. time.sleep(1)
  22. driver.find_element_by_xpath('//*[@id="login_button"]').click()
  23. time.sleep(1)
  24. cookie_list = driver.get_cookies()
  25. cookie_dict = {}
  26. for cookie in cookie_list:
  27. if 'name' in cookie and 'value' in cookie:
  28. cookie_dict[cookie['name']] = cookie['value']
  29. with open('cookie_dict.txt', 'w') as f:
  30. json.dump(cookie_dict, f)
  31. return True

找到查看好友的接口

进入我的空间,点击 F12 检查界面,将 Network 清空后点击好友界面。
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图1
首选盲猜好友列表含有friend字段。直接选择搜索发现出来一些数据,挨个查找之后发现好友字段。保存当前获得的 url 供日后查询。
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图2


破解data里面的加密参数

爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图3
看到只有一个 g_tk 加密参数就很激动,就一个加密!
去 Sources 里面搜索 g_tk 取值到底是什么加密,发现是个函数点进去看后发现是个简单的小加密。可以写 python 代码。
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图4
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图5
Python代码如下:

  1. def get_g_tk(): # QQ空间的加密算法
  2. p_skey = cookie['p_skey']
  3. h = 5381
  4. for i in p_skey:
  5. h += (h << 5) + ord(i)
  6. g_tk = h & 2147483647
  7. return g_tk

在QQ空间好友栏获取好友列表

拿到加密参数后,接下来我们就只需要进刚才所说的空间好友栏页面将所有的好友的QQ号抓下来,用urllib.parse.urlencode(data)将参数转成我们常见的url后面缀了一长串&&&的形式与原始链接拼接,然后就可以带上cookies发送请求获取json数据,

  1. def get_friends_uin(g_tk): # 获得好友的QQ号信息
  2. yurl = 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?'
  3. data = {
  4. 'uin': cookie['ptui_loginuin'],
  5. 'do': 1,
  6. 'g_tk': g_tk
  7. }
  8. url = yurl + urllib.parse.urlencode(data)
  9. res=requests.get(url, headers = headers, cookies = cookie)
  10. r = res.text.split('(')[1].split(')')[0]
  11. friends_list=json.loads(r)['data']['items_list']
  12. friends_uin=[]
  13. for f in friends_list:
  14. friends_uin.append(f['uin'])
  15. return friends_uin

找到屏蔽我的”狠人”

拿到好友的QQ号之后,咱们就能直接访问好友的空间了,但是好友 设置了拒绝访问,一定要拿小本本记下来!
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图6

  1. def get_blacklist(friends): # 查询被挡好友的QQ号,用小本本记下来!
  2. access_denied=[] # 拉黑笔记,小本本记下来!
  3. yurl = 'https://user.qzone.qq.com/'
  4. for friend in friends:
  5. print("开始检查:"+str(friend))
  6. url = yurl + str(friend)
  7. res = requests.get(url,headers=headers,cookies=cookie)
  8. tip = etree.HTML(res.text).xpath('/html/body/div/div/div[1]/p/text()')
  9. if len(tip) > 0:
  10. #if tip[0][:7] == "主人设置了权限":
  11. print(str(friend)+"把我拉黑了!")
  12. access_denied.append(friend)
  13. return access_denied

秃然好心寒

其实看到这,我就有点心寒了。。。。
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图7


拉黑这帮重色轻友的人!

进入自己心灵想进去的地方,拉黑他们!
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图8
发现只有一个 post 请求,那应该就只能是这个了。
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图9
看了眼所需要的参数,自己的号,拉黑的号,自己的空间,加上一个无用参数和刚才所获得加密参数。
爬虫实战--拉黑 QQ 空间屏蔽我的“大人物“ - 图10
越想越气,写代码!

  1. def pull_black(): # 拉黑,必须拉黑!
  2. global cookie
  3. cookie = search_cookie()
  4. with open('access_denied.txt', 'r') as f:
  5. access_denied = f.readlines()
  6. for fake_friend in access_denied:
  7. fake_friend = fake_friend.split('\n')[0]
  8. yurl = "https://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/right/cgi_black_action_new?"
  9. g_tk = get_g_tk()
  10. url_data = {'g_tk': g_tk}
  11. data = {
  12. 'uin': cookie['ptui_loginuin'],
  13. 'action': '1',
  14. 'act_uin': fake_friend,
  15. 'fupdate': '1',
  16. 'qzreferrer': 'https://user.qzone.qq.com/1223411083'
  17. }
  18. url = yurl + urllib.parse.urlencode(url_data)
  19. res=requests.post(url, headers = headers, data=data, cookies = cookie)
  20. print(str(fake_friend)+"已被您拉黑")
  21. print("都拉黑了!解气!!")

全部代码

  1. import time
  2. import json
  3. import re
  4. import urllib
  5. import requests
  6. from lxml import etree
  7. import threadpool
  8. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  9. def search_cookie():
  10. if not __import__('os').path.exists('cookie_dict.txt'):
  11. get_cookie_json()
  12. with open('cookie_dict.txt', 'r') as f:
  13. cookie=json.load(f)
  14. return cookie
  15. def get_cookie_json(): # 无头selenium登陆
  16. qq_number = input('请输入qq号:')
  17. password = __import__('getpass').getpass('请输入qq密码:')
  18. from selenium import webdriver
  19. from selenium.webdriver.chrome.options import Options
  20. login_url = 'https://i.qq.com/'
  21. chrome_options =Options()
  22. chrome_options.add_argument('--headless')
  23. driver = webdriver.Chrome(options=chrome_options)
  24. driver.get(login_url)
  25. driver.switch_to_frame('login_frame')
  26. driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
  27. time.sleep(1)
  28. driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq_number)
  29. driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
  30. time.sleep(1)
  31. driver.find_element_by_xpath('//*[@id="login_button"]').click()
  32. time.sleep(1)
  33. cookie_list = driver.get_cookies()
  34. cookie_dict = {}
  35. for cookie in cookie_list:
  36. if 'name' in cookie and 'value' in cookie:
  37. cookie_dict[cookie['name']] = cookie['value']
  38. with open('cookie_dict.txt', 'w') as f:
  39. json.dump(cookie_dict, f)
  40. return True
  41. def get_g_tk(): # QQ空间的加密算法
  42. p_skey = cookie['p_skey']
  43. h = 5381
  44. for i in p_skey:
  45. h += (h << 5) + ord(i)
  46. g_tk = h & 2147483647
  47. return g_tk
  48. def get_friends_uin(g_tk): # 获得好友的QQ号信息
  49. yurl = 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?'
  50. data = {
  51. 'uin': cookie['ptui_loginuin'],
  52. 'do': 1,
  53. 'g_tk': g_tk
  54. }
  55. url = yurl + urllib.parse.urlencode(data)
  56. res=requests.get(url, headers = headers, cookies = cookie)
  57. r = res.text.split('(')[1].split(')')[0]
  58. friends_list=json.loads(r)['data']['items_list']
  59. friends_uin=[]
  60. for f in friends_list:
  61. friends_uin.append(f['uin'])
  62. return friends_uin
  63. def get_blacklist(friends): # 查询被挡好友的QQ号,用小本本记下来!
  64. access_denied=[] # 拉黑笔记,小本本记下来!
  65. yurl = 'https://user.qzone.qq.com/'
  66. for friend in friends:
  67. print("开始检查:"+str(friend))
  68. url = yurl + str(friend)
  69. res = requests.get(url,headers=headers,cookies=cookie)
  70. tip = etree.HTML(res.text).xpath('/html/body/div/div/div[1]/p/text()')
  71. if len(tip) > 0:
  72. #if tip[0][:7] == "主人设置了权限":
  73. print(str(friend)+"把我拉黑了!")
  74. access_denied.append(friend)
  75. return access_denied
  76. def pull_black(): # 拉黑,必须拉黑!
  77. global cookie
  78. cookie = search_cookie()
  79. with open('access_denied.txt', 'r') as f:
  80. access_denied = f.readlines()
  81. for fake_friend in access_denied:
  82. fake_friend = fake_friend.split('\n')[0]
  83. yurl = "https://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/right/cgi_black_action_new?"
  84. g_tk = get_g_tk()
  85. url_data = {
  86. 'g_tk': g_tk
  87. }
  88. data = {
  89. 'uin': cookie['ptui_loginuin'],
  90. 'action': '1',
  91. 'act_uin': fake_friend,
  92. 'fupdate': '1',
  93. 'qzreferrer': 'https://user.qzone.qq.com/1223411083'
  94. }
  95. url = yurl + urllib.parse.urlencode(url_data)
  96. res=requests.post(url, headers = headers, data=data, cookies = cookie)
  97. print(str(fake_friend)+"已被您拉黑")
  98. print("都拉黑了!解气!!")
  99. def recording(): # 主函数
  100. global cookie
  101. cookie = search_cookie()
  102. g_tk = get_g_tk()
  103. friends_uin = get_friends_uin(g_tk)
  104. access_denied = get_blacklist(friends_uin)
  105. print(f"一共有{len(access_denied)}人把你拉黑了!")
  106. with open('access_denied.txt', 'w') as f:
  107. for a in access_denied:
  108. f.write(str(a)+'\n')
  109. if __name__ == '__main__': # 运行
  110. recording()
  111. pull_black()

最后还是希望你们能给我点一波小小的关注。

奉上自己诚挚的爱心💖