这是个人很久以前在闲暇之余写的一个专案,技术多为爬虫观念,後来整合 GitHub Action,让他人 fork 之後就能直接享用。此篇文章会教如何自动登入 iThelp,理解观念与实作後再带你直接 fork 此专案并做一些设定,让 GitHub Action 帮你天天赚取登入点数。
若想直接使用此专案,请直接跳到下方的「不想写程序?早 fork 早享用」章节阅读使用说明。
许多论坛都拥有活动点数制度,「iT邦帮忙」也不意外的拥有这项功能,其中有一项是每天登入可以加 2 点活动点数,但不知道是 Bug 还是故意的,竟然需要先登出再登入,有了登入的动作才会计算当天登入的活动点数,很不符合常理。
因此利用爬虫技能写了一个专案,每天到指定时间会自动完成登入动作,让我就算没有登入这个动作,也可以得到活动点数,虽说这个点数量不多,但就是想要抵抗这个 Bug。
详细登入问题也有人提请官方修正,可参考 关於IT邦登入时点数的问题。
在动手爬虫之前,必须先观察在登入计算活动点数时,会经过哪些步骤与所需资讯,观察时请记得使用开发人员工具 (F12) 来查看资讯流动。
第一步至 iThome会员登入页面 任意输入一组帐号,按下登入按钮然後查看封包,会看到有三个栏位分别为 _token
、account
还有 password
account
与 password
我们理解,但是 _token
的值从何而来呢?到开发人员工具的 Elements
页签搜寻 _token
,就可以找到它所在位置,原来是在登入表单内的一个隐藏栏位 (hidden input)!
知道登入需要甚麽资讯,且资讯在哪里可以取得,就可以开始规划要如何利用爬虫来做登入功能。
_token
栏位的值。_token
、account
与 password
一起 POST
到 https://member.ithome.com.tw/login
需要注意的是,这些过程中的 Cookie
需要被维护,也就是每个 Request 都必须是同一个 Session
,否则 _token
值无效。强大的 requests
套件已经帮我们准备好 Session
物件来处理这些事情,让我们不用手动转移 Cookie
到不同的 request 之中。
# 从 sAccount.json 档案读取帐密资料
s_account = json.load(open("./sAccount.json", "r", encoding="utf-8"))
# 更改 User-Agent 标头以免被阻挡
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"}
# 制作 Payload,有三个栏位分别为 _token、account 与 password
loginPayload = {'account': s_account['account'], 'password': s_account['password'], '_token':''}
# 建立一个 Session 物件帮我们维护 Coookie 的运行
sess = requests.Session()
# 将 User-Agent 标头修改为我们所给的值
sess.headers.update(headers)
# 先取得 _token 值
url = "https://member.ithome.com.tw/login"
response = sess.get(url)
bsObj = bs(response.text, "html.parser")
loginToken = bsObj.find('input', {'name':'_token'}).attrs['value']
# 把 _token 值存到我们之前建立的 Payload 内
loginPayload['_token'] = loginToken
# 对登入页面 POST 一次,就可以顺利登入罗
url = "https://member.ithome.com.tw/login"
response = sess.post(url, data=loginPayload)
sAccount.json
内容如下,只需填入对应的帐号密码
{
"account": "",
"password": ""
}
到这里,登入功能已经完成了。但假如真的去运行这个程序码,你会发现虽然成功登入,可是并没有取得想要的到的每日登入活动点数,这个是因为登入与取得点数的功能是分开运行的。
再让我们观察一下取得活动点数的关键在哪里。先进入 iT邦帮忙,再点击登入按钮,这次需要输入正确的帐号密码,并且观察开发人员工具中的封包,将会看到其实在成功登入後,从 会员中心 跳转回 iT邦帮忙 之前还有其他封包被传送,可以猜测这些封包就是用来激活每日登入的条件
也就是说当我们的爬虫成功登入後,需要发出 GET https://member.ithome.com.tw/oauth/authorize?client_id=ithelp&redirect_uri=https://ithelp.ithome.com.tw/users/callback&response_type=code
请求,来取得这天的每日登入活动点数。
这是最简单的部分,只需要在登入之後加上下面两行程序,就可以达到效果了
url = "https://member.ithome.com.tw/oauth/authorize?client_id=ithelp&redirect_uri=https://ithelp.ithome.com.tw/users/callback&response_type=code"
response = sess.get(url)
到这里,概念与实作讲解完毕,当然除登入并取得点数外,还可以加一些功能例如确认是否真的登入或者是是否有错误发生的判断。
可以到我的 GitHub 上参考 完整原始码。
然而这个 Bug 在 2021/05/12
时小财神宣布已经根除 (关於IT邦登入时点数的问题),真是皆大欢喜。得知这个讯息的第一个想法是这个专案好像没有用了,但其实我们还是一样可以继续排程,若是哪天较忙忘记浏览论坛,可让爬虫代替我们每天取得点数。
此专案能够透过 GitHub Action 自动排程,因此读者只需要直接 Fork 此专案,并添加对应的 secrets
环境变数,即可使用此专案的自动登入功能!接下来将补充说明如何使用 Fork 并透过 Action 排程与运行此专案。
在专案页面中点击 Fork
,看到 forked from weirenxue/ithelp-login-script
即为 Fork 成功!
将 iThelp 帐号密码加入 secrets
环境变数,变数名称需要完全相同 (注:任何存在 secrets
环境变数中的数值都是加密过的,因此可以放心输入)
因为此专案来源为 Fork,GitHub 预设关闭透过 Fork 而来的 Repo 其 Action 功能与 Workflow,因此需要手动启用
最後只需要手动执行 Workflow 即可测试是否能正常地自动登入 iThelp 论坛
Workflow 可以透过 GitHub Action schedule 来描述何时该执行,即排程的做法。当指定的时间到来,则可以直接在 GitHub 上运行,不用额外开机器去执行,非常方便!
目前专案的排程设定可以在 .github/workflows/main.yml
中找到,预设为每日的 12 点执行此 Workflow。这里指的是 UTC+0 的时间,所以 GitHub Action 12 点 (UTC+0) 对应到台湾时间为晚上 8 点 (UTC+8)
schedule:
- cron: "0 12 * * *"
若读者想要自定义排程时间,这里提供相对应的时间说明供读者参考,读者可以在 Fork 後的专案自行更改!
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *
<<: visual studio dll lib 建立与呼叫
记忆大考验 教学原文参考:记忆大考验 这篇文章会使用「阵列」积木,建立两组灯号数据,搭配「函式」、「...
Tabs 选项卡 这个组件可以提供比较好的使用者体验,在他切换浏览页面时也有比较好的动态效果。 下面...
嗨咪纳桑,咱是immortalmice,今天要来和各位分享自己研究出的几个新资料结构 这个资料结构支...
说明、缘由 投入资讯产业约17年,历经过许多的程序语言,也投入过不同的行业别,5年前开始接触Odoo...
-波特的价值链(Porter’s Value Chain) 业务就是提供产品和服务以创造价值并实现...