用阿里云服务器实现贴吧自动签到

为什么

​ 平时几乎逛贴吧,又不水贴,所以等级基本不高。发帖问问题有要一点等级撑腰。当然可以拿来装B。

​ 以前用过两个别人提供的签到服务,都需要提供Cookie,感觉不太可靠。当然,他们提供的服务我也没用多久。

本地运行

​ 从利用阿里云的函数计算实现百度贴吧免费定时签到复制python代码可以运行,但需要改成3一下的版本。

​ 首先从官网下载包安装。由于我不想卸载3的版本,所以通过添加PYTHON_HOME,然后在Path里引用。这样就可以通过修改PYTHON_HOME的值就可修改成想要用的版本。但最终我没改值,而是在命令行里使用2的版本运行程序。

​ 此时又遇到库的问题。解决方式可以下载库,理论也可把3里下的库复制过来。我想节约空间就用命令mklink /j "D:\Python275\Lib\site-packages" "D:\Python\Lib\site-packages"进行联接(应该是软联接,不是快捷方式,需要前面的文件夹不存在)。这样就可以用3里面的库了。

​ 总是在f处报SyntaxError: invalid syntax,但3正常,于是换成用format的。改了之后又报编码相关的错UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)。这回添加

1
2
3
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

就好,而且在服务器上也可以运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# -*- coding: utf-8 -*-
from requests import Session
from time import sleep

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def handler(*args):
# 数据
like_url = 'https://tieba.baidu.com/mo/q/newmoindex?'
sign_url = 'http://tieba.baidu.com/sign/add'
tbs = '自行寻找'
head = {
'Accept': 'text/html, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
'Cookie': '自行寻找',
'Host': 'tieba.baidu.com',
'Referer': 'http://tieba.baidu.com/i/i/forum',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/71.0.3578.98 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'}
s = Session()

# 获取关注的贴吧
bars = []
dic = s.get(like_url, headers=head).json()['data']['like_forum']
for bar_info in dic:
bars.append(bar_info['forum_name'])

# 签到
already_signed_code = 1101
success_code = 0
need_verify_code = 2150040
already_signed = 0
succees = 0
failed_bar = []
n = 0

while n < len(bars):
sleep(0.5)
bar = bars[n]
data = {
'ie': 'utf-8',
'kw': bar,
'tbs': tbs
}
try:
r = s.post(sign_url, data=data, headers=head)
except Exception as e:
print("未能签到{}, 由于{}。".format(bar,e))
failed_bar.append(bar)
continue
dic = r.json()
msg = dic['no']
if msg == already_signed_code:
already_signed += 1;
r = '已经签到过了!'
elif msg == need_verify_code:
n -= 1;
r = '需要验证码,即将重试!'
elif msg == success_code:
#r = f"签到成功!你是第{dic['data']['uinfo']['user_sign_rank']}个签到的吧友,共签到{dic['data']['uinfo']['total_sign_num']}天。"
r = "签到成功!你是第{}个签到的吧友,共签到{}天。".format(dic['data']['uinfo']['user_sign_rank'],dic['data']['uinfo']['total_sign_num'])
else:
r = '未知错误!' + dic['error']
#print("{}:{}".format(bar,r))
print(bar+":"+r)
succees += 1
n += 1
l = len(bars)
failed = "\n失败列表:" + '\n'.join(failed_bar) if len(failed_bar) else ''
print("共{}个吧,其中: {}个吧签到成功,{}个吧签到失败,{}个吧已经签到。{}".format(l,succees,len(failed_bar),already_signed,failed))
handler()

服务器(LAMP环境)运行

  1. 编写shell。因为要添加至定时任务,所以路径要写全。shell的文件在/opt/corn/下面,生成的文件也在这里。

    有bug的代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/bin/bash
    f_dir=$(date +%Y)
    s_dir=$(date +%m)
    t_dir=$(date +%d)
    num=1
    r_dir=/opt/cron
    # 创建文件夹
    if [ ! -d ${r_dir}/${f_dir}/${s_dir} ];then
    mkdir -p ${f_dir}/${s_dir}
    var1='log'${1:-${num}}+$(date +%H-%M-%S)+'执行创建'+${r_dir}/${f_dir}/${s_dir}
    #echo 1
    else
    var1='log'${1:-${num}}+$(date +%H-%M-%S)+'已存在'+${r_dir}/${f_dir}/${s_dir}
    #echo 2
    fi
    echo ${var1} >> ${r_dir}/${f_dir}/${s_dir}/${t_dir}.log
    # 运行python代码
    python /opt/cron/tieba2.py > ${r_dir}/${f_dir}/${s_dir}/${t_dir}+${1:-${num}}.txt || echo 'log'${1:-${num}}+$(date +%H-%M-%S)+'python运行失败' >> ${r_dir}/${f_dir}/${s_dir}/${t_dir}.log

    echo ${f_dir}+${s_dir}+${t_dir}
    # 为生成<li></li> 此处可把if删掉,把下面的>>换成>
    tmp=${r_dir}/${f_dir}/${s_dir}/${t_dir}'tmp'.txt
    if [ -f ${tmp} ];then
    rm -rf ${tmp} && echo 'log'${1:-${num}}+$(date +%H-%M-%S)+'中间文件已存在-删除'+${tmp}
    fi

    cat ${r_dir}/${f_dir}/${s_dir}/${t_dir}+${1:-${num}}.txt | while read line;do
    echo '<li>'${line}'</li>' >> ${tmp}
    done
    # 拼接html
    cat /opt/cron/head.txt > /var/www/html/index.html
    cat ${tmp} >> /var/www/html/index.html
    cat /opt/cron/tail.txt >> /var/www/html/index.html

    echo 'done'

    代码在跨月时,可能会出问题,可设计多运行几次。下面的代码稍微改了点,还是有问题,不改了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #!/bin/bash
    f_dir=$(date +%Y)
    s_dir=$(date +%m)
    t_dir=$(date +%d)
    num=1
    r_dir=/opt/cron
    echo ${r_dir}/${f_dir}/${s_dir} > ${r_dir}/daily.log
    if [ ! -d ${r_dir}/${f_dir}/${s_dir} ];then
    mkdir -p ${f_dir}/${s_dir}
    var1='log'${1:-${num}}+$(date +%H-%M-%S)+'执行创建'+${r_dir}/${f_dir}/${s_dir}
    #echo 1
    else
    var1='log'${1:-${num}}+$(date +%H-%M-%S)+'已存在'+${r_dir}/${f_dir}/${s_dir}
    #echo 2
    fi
    echo ${var1} >> ${r_dir}/${f_dir}/${s_dir}/${t_dir}.log
    python /opt/cron/tieba2.py > ${r_dir}/${f_dir}/${s_dir}/${t_dir}+${1:-${num}}.txt || echo 'log'${1:-${num}}+$(date +%H-%M-%S)+'python运行失败' >> ${r_dir}/${f_dir}/${s_dir}/${t_dir}.log

    echo ${f_dir}+${s_dir}+${t_dir}

    tmp=${r_dir}/${f_dir}/${s_dir}/${t_dir}'tmp'.txt
    if [ -f ${tmp} ];then
    rm -rf ${tmp} && echo 'log'${1:-${num}}+$(date +%H-%M-%S)+'中间文件已存在-删除'+${tmp}
    fi

    cat ${r_dir}/${f_dir}/${s_dir}/${t_dir}+${1:-${num}}.txt | while read line;do
    echo '<li>'${line}'</li>' >> ${tmp}
    done

    cat /opt/cron/head.txt > /var/www/html/index.html
    echo '<li>'${f_dir}+${s_dir}+${t_dir}'<li>' >> /var/www/html/index.html
    cat ${tmp} >> /var/www/html/index.html
    cat /opt/cron/tail.txt >> /var/www/html/index.html

    echo 'done'

  2. 如果需要多次执行生成不同的文件,要传入数字,表示第几次执行。

  3. 有设计日志,出问题可看。

  4. 拼接的html很简单。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>贴吧每日签到</title>
    <style type="text/css">
    body {
    text-align: center
    }
    div {
    width: auto;
    }
    #fdiv {
    border: 1px solid #000;
    margin: 0 auto;
    height: 1700px;
    }
    </style>

    <script type="text/javascrip">

    </script>
    </head>
    <body>
    <div id="fdiv">
    <ol id="tb">
    <!--此处分割为两个文件-->
    </ol>
    </div>
    </body>
    </html>
  5. 如果需要网页有较多功能,比如再执行一边。可自行设计。由于我前段时间看过尚学堂杨淑娟老师-手写服务器,代码也有,所以修改修改再添加点,最后打包,就应该可以放到服务器里运行了。

  6. 服务器到期后可放到阿里、腾讯、百度的函数计算上。个人推荐百度的,因为有免费1G的外网流量。leancloud也可应该。