啥?网易云签到可以领取蓝牙耳机?我用Python实现自动签到给女朋友薅了一个!

475 阅读6分钟

导语

     今天日常上班,路上打开网易云.点进去听歌,有个签到按钮,我就顺手点了!签到之后发现可以用签到积分来兑换蓝牙耳机?不知道你们清楚不,我用的是联通的电话话,用了很多年了,所以每年我都可以用积分兑换保温杯,洗面奶,纸巾等等这些用品,没想到网易云也出活动了!

这个是界面

​​

简直是巴适客滴博!

刚好女朋友还没有蓝牙耳机,还是用的那种有线耳机!可以给你来一份了!但是又担心忘记来签到,导致耳机被领完,所以我用Python写了个

网易云音乐自动签到脚本

好好看,好好学!

关键是签到脚本市场是需求很大的,完全可以通过这个自动签到脚本来薅羊毛!

æ”¯ä»˜å®æ‰«ç é¢†çº¢åŒ…è¢«è–…ç¾Šæ¯›,é«˜ç«¯çŽ©å®¶èµšäº†å‡ åä¸‡

​简单的介绍一下原理,网易云音乐post参数加密方式详解这里就不多介绍了,不懂这一块的直接找我获取网易云解密的详细视频教程就行.

假如这篇文章破2000阅读,小编就金馆长熊猫给你们看!立个flag先.

è¶…è½¯èŒçš„è¿·ä½ è¡¨æƒ…,萌妹子必备

既然要签到,首先,自然是需要模拟登录啦,这里我们还是简单地利用我们开源的DecryptLogin库来实现网易云音乐的模拟登录:

'''模拟登录'''
@staticmethod
def login(username, password):
  lg = login.Login()
  _, session = lg.music163(username, password)
  return session

成功登录之后,我们来分析一下如何实现网易云音乐的自动签到。按F12打开开发者工具,然后点击一下网易云音乐的签到按钮

                                      ​

​​可以发现一个疑似签到用的post请求:

图片

其链接构成为:

'https://music.163.com/weapi/point/dailyTask?csrf_token=' + csrf

​之前的文章里我们说过,csrf这个参数在登录后的cookies里可以找到,类似这样:

csrf = re.findall('__csrf=(.*?) for', str(session.cookies))[0]

所以我们现在要解决的问题是如何找到该post请求需要提交的data的原文,因为网页里看到的内容是加密后的,就像这样:

图片

图片

第一个显然是我们找到签到接口,那就点开第二个看看吧:

图片

query不会就是我们想要的原文吧。试试?尝试成功的话岂不是血赚?于是,调用一下DecryptLogin库里写好的网易云音乐post参数加密算法,来加密一下data(网易云音乐所有post请求的携带的data原文都要先用一个加密算法进行加密之后再提交):

from DecryptLogin.platforms.music163 import Cracker

cracker = Cracker()
# 注: typeid为0代表APP上签到, 为1代表在网页上签到
data = {
          'type': typeid
        }
data = cracker.get(data)

 ​然后发送请求测试一下:

signin_url = 'https://music.163.com/weapi/point/dailyTask?csrf_token=' + csrf
headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
      'Content-Type': 'application/x-www-form-urlencoded',
      'Referer': 'http://music.163.com/discover',
      'Accept': '*/*'
    }
res = self.session.post(signin_url, headers=headers, data=data)

发现返回的数据是这样的:

图片

这个结果说明我们刚刚的猜想完全正确,只是因为我们已经签到过了,所以才显示重复签到。最后,为了节约每天在命令行输入账号密码的时间,我们可以在脚本的最前面添加几行代码:

if os.path.exists('config.json'):
  f = open('config.json', 'r', encoding='utf-8')
  info = json.load(f)
  f.close()
else:
  args = parseArgs()
  info = {'username': args.username, 'password': args.password}
  f = open('config.json', 'w', encoding='utf-8')
  json.dump(info, f)
  f.close()

解释一下代码含义,就是如果当前文件夹里有config.json这个文件:

图片

那么我们就直接从这个json文件里读取用户的账户名密码,否则就启动命令行参数解析函数:

'''命令行参数解析'''
def parseArgs():
  parser = argparse.ArgumentParser(description='网易云音乐自动签到')
  parser.add_argument('--username', dest='username', help='用户名', type=str, required=True)
  parser.add_argument('--password', dest='password', help='密码', type=str, required=True)
  args = parser.parse_args()
  return args

让用户手动输入账户密码,并自动保存到config.json这个文件中,这样下次就不需要再重新输入一遍账户密码啦。

因为涉及到账户密码,我就不录屏了,就截个效果图吧(因为测试的时候已经签到过一次了,所以运行脚本再签到一次就显示因为重复签到而签到失败了,懒得找新的账号了T_T):

图片

                                    é€ä½ 一组高考结束 表情包 大考之后去哪玩 这里最全丨附天气提醒

​到这里就差不多了,也是到了咱们该说再见的时候了,不过我知道你们肯定会问,代码咋不贴上来,

由于一些特殊情况这里就不贴代码了,嘿嘿嘿

åºŸè¯è¿˜ç”¨ä½ è¯´è¡¨æƒ…åŒ… 欢迎仪式结束表情包下载 乐游网游戏下载

好了好了,不贴代码怎么对得起你们的支持,这不就贴上来了吗!

附源码

#编程女码农
import os
import re
import json
import argparse
from DecryptLogin import login
from DecryptLogin.core.music163 import Cracker


'''命令行参数解析'''
def parseArgs():
    parser = argparse.ArgumentParser(description='网易云音乐自动签到')
    parser.add_argument('--username', dest='username', help='用户名', type=str, required=True)
    parser.add_argument('--password', dest='password', help='密码', type=str, required=True)
    args = parser.parse_args()
    return args


'''网易云音乐自动签到'''
class NeteaseSignin():
    def __init__(self, username, password, **kwargs):
        self.username = username
        self.session = NeteaseSignin.login(username, password)
        self.csrf = re.findall('__csrf=(.*?) for', str(self.session.cookies))[0]
        self.cracker = Cracker()
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Referer': 'http://music.163.com/discover',
            'Accept': '*/*'
        }
    '''外部调用'''
    def run(self):
        # 签到接口
        signin_url = 'https://music.163.com/weapi/point/dailyTask?csrf_token=' + self.csrf
        # 模拟签到(typeid为0代表APP上签到, 为1代表在网页上签到)
        typeids = [0, 1]
        for typeid in typeids:
            client_name = 'Web端' if typeid == 1 else 'APP端'
            # --构造请求获得响应
            data = {
                'type': typeid
            }
            data = self.cracker.get(data)
            res = self.session.post(signin_url, headers=self.headers, data=data)
            res_json = res.json()
            # --判断签到是否成功
            if res_json['code'] == 200:
                print('[INFO]: 账号%s在%s签到成功...' % (self.username, client_name))
            else:
                print('[INFO]: 账号%s在%s签到失败, 原因: %s...' % (self.username, client_name, res_json.get('msg')))
    '''模拟登录'''
    @staticmethod
    def login(username, password):
        lg = login.Login()
        _, session = lg.music163(username, password)
        return session


'''run'''
if __name__ == '__main__':
    if os.path.exists('config.json'):
        f = open('config.json', 'r', encoding='utf-8')
        info = json.load(f)
        f.close()
    else:
        args = parseArgs()
        info = {'username': args.username, 'password': args.password}
        f = open('config.json', 'w', encoding='utf-8')
        json.dump(info, f)
        f.close()
    sign_in = NeteaseSignin(username=info.get('username'), password=info.get('password'))
    sign_in.run()

 ​到这里咱们就该说再见了,咱们下篇见!

                                     å‘Šè¾ž 再见 拜拜 我走了 告别系列表情包 九蛙图片

差点忘了,上面有提到,如果不会解密的童鞋,就看这里啦!视频,.源码都在

如果你用得到的话可以直接拿走,点击领取。

不方便点链接的加企鹅群:948351247