# -- coding:UTF-8 -- import requests import time import json from urllib import request from http import cookiejar # 小米ID mid = '' # 小米账号的密码MD5值 pMd5 = '' # 避免登录失败,如果上面的md5中有小写字母,转换为大写 pMd5 = pMd5.upper() # 如果登录一直需要短信验证码,在此填入设备id(在account.xiaomi.com的cookie中寻找deviceId) devId = '' # 常用浏览器UA # 需要改成你自己常用的浏览器的UA lUa = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 ' \ 'Core/1.70.3870.400 QQBrowser/10.8.4405.400 ' # 开发版内测5428803 开发版公测5433318 稳定版内测5462204 目前测试三个中完成任意一个即可全部完成 boardId = '5428803' # 留空 cookie = '' # 留空 miui_vip_ph = '' def wLog(text): now_localtime = time.strftime("%H:%M:%S", time.localtime()) print(now_localtime + ' | ' + str(text)) def thumbUp(): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/community/post/thumbUp?postId=28270729', headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("点赞失败:Cookie无效") elif rJson['code'] != 200: return wLog("点赞失败:" + str(rJson['message'])) wLog("点赞成功") except: wLog("点赞出错") def cancelThumbUp(): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/community/post/cancelThumbUp?postId=28270729', headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("取消点赞失败:Cookie无效") elif rJson['code'] != 200: return wLog("取消点赞失败:" + str(rJson['message'])) wLog("取消点赞成功") except: wLog("取消点赞出错") def deletePost(tid): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/community/post/detail/delete?postId=' + str(tid), headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("删除内容失败:Cookie无效") elif rJson['code'] != 200: return wLog("删除内容失败:" + str(rJson['message'])) wLog("删除内容成功:" + str(rJson['message'])) except: wLog("删除内容出错,请手动删除") # 发帖 def newAnnounce(tType): headers = { 'cookie': str(cookie) } data = { 'announce': '{"textContent":"小米社区闪退","boards":[{"boardId":"' + boardId + '"}],"announceType":"' + str( tType) + '"}', 'miui_vip_ph': str(miui_vip_ph) } try: response = requests.post('https://api.vip.miui.com/api/community/post/add/newAnnounce', headers=headers, data=data) rJson = response.json() if rJson['code'] == 401: return wLog("发表内容失败:Cookie无效") elif rJson['code'] != 200: return wLog("发表内容失败:" + str(rJson['message'])) postEntity = json.loads(rJson['entity']) wLog("发表内容成功,帖子ID:" + str(postEntity['announceId']) + ",将在3秒后删除") addCommentReturnCommentInfo(str(postEntity['announceId'])) time.sleep(3) # 执行5次删帖是为了防止删帖失败 for i in range(0, 5): deletePost(postEntity['announceId']) except: wLog("发表内容出错") # 回帖 def addCommentReturnCommentInfo(tid): headers = { 'cookie': str(cookie) } data = { 'postId': str(tid), 'text': '小米社区闪退', 'miui_vip_ph': str(miui_vip_ph) } try: response = requests.post('https://api.vip.miui.com/mtop/planet/vip/content/addCommentReturnCommentInfo', headers=headers, data=data) rJson = response.json() if rJson['code'] == 401: return wLog("回复失败:Cookie无效") elif rJson['code'] != 200: return wLog("回复失败:" + str(rJson['message'])) wLog("回复成功") except: wLog("回复出错") def getVipCookie(url): global cookie global miui_vip_ph try: rCookie = cookiejar.CookieJar() handler = request.HTTPCookieProcessor(rCookie) opener = request.build_opener(handler) response = opener.open(url) for item in rCookie: cookie += item.name + '=' + item.value + ';' if cookie == '': return False cklist = cookie.replace(" ", "").split(';') for ph in cklist: if "miui_vip_ph=" in ph: miui_vip_ph = ph.replace("miui_vip_ph=", "") break return True except: return False # 提交满意度问卷 def submitSurvey(sid): headers = { 'cookie': str(cookie) } data = { 'survey': '{"surveyId":' + str(sid) + ',"answer":{"1":"A"}}', 'businessId': '2', 'miui_vip_ph': str(miui_vip_ph) } try: response = requests.post('https://api.vip.miui.com/api/miui/dev/survey/submit', headers=headers, data=data) rJson = response.json() if rJson['code'] == 401: return wLog("满意度投票失败:Cookie无效") elif rJson['code'] != 200: return wLog("满意度投票失败:" + str(rJson['message'])) wLog("满意度投票成功") except: wLog("满意度投票出错") # 获取满意度投票问卷ID def getSurveyId(): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/miui/dev/survey?businessId=2', headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("获取问卷ID失败:Cookie无效") elif rJson['code'] != 200: return wLog("获取问卷ID失败:" + str(rJson['message'])) elif rJson['entity']['surveyInfo']['surveyId'] is None: wLog("获取问卷ID失败:问卷ID为空") surveyId = rJson['entity']['surveyInfo']['surveyId'] wLog("获取问卷ID成功:" + str(surveyId)) submitSurvey(surveyId) except: wLog("获取问卷ID出错,满意度投票失败") # 取关用户 def unfollowUser(): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/community/user/relation/unfollow?followeeId=210836962', headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("取关用户失败:Cookie无效") elif rJson['code'] != 200: return wLog("取关用户失败:" + str(rJson['message'])) wLog("取关用户成功") except: wLog("取关用户出错") # 关注用户 def followUser(): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/community/user/relation/follow?followeeId=210836962', headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("关注用户失败:Cookie无效") elif rJson['code'] != 200: return wLog("关注用户失败:" + str(rJson['message'])) wLog("关注用户成功") except: wLog("关注用户出错") # 退出圈子 def unfollowBoard(): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/community/board/unfollow?boardId=5462662', headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("退出圈子失败:Cookie无效") elif rJson['code'] != 200: return wLog("退出圈子失败:" + str(rJson['message'])) wLog("退出圈子成功") except: wLog("退出圈子出错") # 加入圈子 def followBoard(): headers = { 'cookie': str(cookie) } try: response = requests.get('https://api.vip.miui.com/api/community/board/follow?boardId=5462662', headers=headers) rJson = response.json() if rJson['code'] == 401: return wLog("加入圈子失败:Cookie无效") elif rJson['code'] != 200: return wLog("加入圈子失败:" + str(rJson['message'])) wLog("加入圈子成功") except: wLog("加入圈子出错") # 活跃度任务领取 def startTask(taskId): headers = { 'cookie': str(cookie) } data = { 'taskId': str(taskId), 'miui_vip_ph': str(miui_vip_ph) } try: response = requests.post('https://api.vip.miui.com/api/community/user/task/start?version=dev.210805', headers=headers, data=data) rJson = response.json() if rJson['code'] == 401: return wLog("开始活跃分任务失败:Cookie无效") elif rJson['code'] != 200: return wLog("开始活跃分任务失败:" + str(rJson['message'])) wLog("开始活跃分任务成功") except: wLog("开始活跃分任务出错") # 活跃度任务完成 def acquireTask(taskId): headers = { 'cookie': str(cookie) } data = { 'taskId': str(taskId), 'miui_vip_ph': str(miui_vip_ph) } try: response = requests.post('https://api.vip.miui.com/api/community/user/task/acquire?version=dev.210805', headers=headers, data=data) rJson = response.json() if rJson['code'] == 401: return wLog("领取活跃分失败:Cookie无效") elif rJson['code'] != 200: return wLog("领取活跃分失败:" + str(rJson['message'])) wLog("领取活跃分成功") except: wLog("领取活跃分出错") def milogin(): proxies = { 'https': None, 'http': None } headers = { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Referer': 'https://account.xiaomi.com/fe/service/login/password?sid=miui_vip&qs=%253Fcallback%253Dhttp%25253A%25252F%25252Fapi.vip.miui.com%25252Fsts%25253Fsign%25253D4II4ABwZkiJzkd2YSkyEZukI4Ak%2525253D%252526followup%25253Dhttps%2525253A%2525252F%2525252Fapi.vip.miui.com%2525252Fpage%2525252Flogin%2525253FdestUrl%2525253Dhttps%252525253A%252525252F%252525252Fweb.vip.miui.com%252525252Fpage%252525252Finfo%252525252Fmio%252525252Fmio%252525252FinternalTest%252525253Fref%252525253Dhomepage%2526sid%253Dmiui_vip&callback=http%3A%2F%2Fapi.vip.miui.com%2Fsts%3Fsign%3D4II4ABwZkiJzkd2YSkyEZukI4Ak%253D%26followup%3Dhttps%253A%252F%252Fapi.vip.miui.com%252Fpage%252Flogin%253FdestUrl%253Dhttps%25253A%25252F%25252Fweb.vip.miui.com%25252Fpage%25252Finfo%25252Fmio%25252Fmio%25252FinternalTest%25253Fref%25253Dhomepage&_sign=L%2BdSQY6sjSQ%2FCRjJs4p%2BU1vNYLY%3D&serviceParam=%7B%22checkSafePhone%22%3Afalse%2C%22checkSafeAddress%22%3Afalse%2C%22lsrp_score%22%3A0.0%7D&showActiveX=false&theme=&needTheme=false&bizDeviceType=', 'User-Agent': str(lUa), 'Origin': 'https://account.xiaomi.com', 'X-Requested-With': 'XMLHttpRequest', 'Cookie': 'deviceId=' + str(devId) + '; pass_ua=web; uLocale=zh_CN' } data = { 'bizDeviceType': '', 'needTheme': 'false', 'theme': '', 'showActiveX': 'false', 'serviceParam': '{"checkSafePhone":false,"checkSafeAddress":false,"lsrp_score":0.0}', 'callback': 'http://api.vip.miui.com/sts?sign=4II4ABwZkiJzkd2YSkyEZukI4Ak%3D&followup=https%3A%2F%2Fapi.vip.miui.com%2Fpage%2Flogin%3FdestUrl%3Dhttps%253A%252F%252Fweb.vip.miui.com%252Fpage%252Finfo%252Fmio%252Fmio%252FinternalTest%253Fref%253Dhomepage', 'qs': '%3Fcallback%3Dhttp%253A%252F%252Fapi.vip.miui.com%252Fsts%253Fsign%253D4II4ABwZkiJzkd2YSkyEZukI4Ak%25253D%2526followup%253Dhttps%25253A%25252F%25252Fapi.vip.miui.com%25252Fpage%25252Flogin%25253FdestUrl%25253Dhttps%2525253A%2525252F%2525252Fweb.vip.miui.com%2525252Fpage%2525252Finfo%2525252Fmio%2525252Fmio%2525252FinternalTest%2525253Fref%2525253Dhomepage%26sid%3Dmiui_vip', 'sid': 'miui_vip', '_sign': 'L+dSQY6sjSQ/CRjJs4p+U1vNYLY=', 'user': str(mid), 'cc': '+86', 'hash': str(pMd5), '_json': 'true' } try: response = requests.post('https://account.xiaomi.com/pass/serviceLoginAuth2', headers=headers, data=data, proxies=proxies) response_data = response.text.lstrip('&').lstrip('START').lstrip('&') rJson = json.loads(response_data) if rJson['code'] == 70016: wLog('小米账号登录失败:用户名或密码不正确') return False if rJson['code'] != 0: wLog('小米账号登录失败:' + rJson['desc']) return False if rJson['pwd'] != 1: wLog('当前账号需要短信验证码,请尝试修改UA或设备ID') return False if not getVipCookie(rJson['location']): wLog('小米账号登录成功,社区获取 Cookie 失败') return False wLog('账号登录完成') return True except: wLog("登录小米账号出错") return False if __name__ == "__main__": wLog("开始登录账号") if milogin(): startTask("10106263") wLog("正在完成BUG反馈任务") newAnnounce("7") wLog("3秒后执行提建议任务") acquireTask("10106263") time.sleep(3) wLog("正在完成提建议任务") newAnnounce("6") wLog("正在完成满意度调查任务") getSurveyId() wLog("正在完成点赞任务") startTask("10106256") for i in range(0, 5): thumbUp() time.sleep(0.2) cancelThumbUp() time.sleep(0.2) acquireTask("10106256") wLog("正在完成活跃分_关注任务") startTask("10106261") unfollowUser() followUser() wLog("1秒后领取活跃分_关注任务") time.sleep(1) acquireTask("10106261") wLog("正在完成活跃分_加圈任务") startTask("10106262") unfollowBoard() followBoard() wLog("1秒后领取活跃分_加圈任务") time.sleep(1) acquireTask("10106262")