简单的 v2ex 自动签到程序 —— 基于 Python Selenium

最近看了点 Selenium 的东西,随手写的一个demo,使用 Chrome 内核,模拟用户每日签到的动作,比较简单的。

# -*- coding:utf-8 -*- 

from selenium import webdriver
import time
import random
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

username = "" 
password = "" 
driver = webdriver.Chrome()
baseUrl = 'https://www.v2ex.com' 
loginUrl = '/signin' 
daliyUrl = '/mission/daily'   

driver.get(baseUrl)
print 'Enter ' + driver.title

time.sleep(random.randint(4,9))
driver.get(baseUrl + loginUrl)

print 'Enter ' + driver.title

tr_elems = driver.find_element_by_id('Main').find_element_by_tag_name('form').find_elements_by_tag_name('tr')

for index, tr_elem in enumerate(tr_elems):
    if index == 0:
        td_elems = tr_elem.find_elements_by_tag_name('td')
        td_name = td_elems[0]
        td_input = td_elems[1].find_element_by_tag_name('input')
        ActionChains(driver).move_to_element(td_input).perform()

        print td_name.text
        td_input.send_keys(username)
    if index == 1:
        td_elems = tr_elem.find_elements_by_tag_name('td')
        td_name = td_elems[0]
        td_input = td_elems[1].find_element_by_tag_name('input')
        ActionChains(driver).move_to_element(td_input).perform()

        print td_name.text
        td_input.send_keys(password)
    if index == 2:
        td_elems = tr_elem.find_elements_by_tag_name('td')
        td_input = td_elems[1].find_elements_by_tag_name('input')[1]
        ActionChains(driver).move_to_element(td_input).perform()

        td_input.click()

# 登录成功就切到新页面 
try:
    mainPage = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.ID, "Rightbar"))
    )
except:
    print "login error" else:
    print 'login ok. Enter ' + driver.title

try:
    dailyButton = WebDriverWait(driver, 1).until(
        EC.presence_of_element_located((By.XPATH, "//a[contains(text(),'领取今日的登录奖励')]"))
    )
except:
    print "no daily corn" else:
    dailyButton = driver.find_element_by_xpath("//a[contains(text(),'领取今日的登录奖励')]")
    ActionChains(driver).move_to_element(dailyButton).click(dailyButton).perform()

time.sleep(random.randint(4,9))
print 'Enter ' + driver.title

try:
    dailyButton = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.XPATH, "//input[contains(@value,'领取')]"))
    )
except:
    print "no daily corn"   
else:
    print "get daily corn"
  	dailyButton = driver.find_element_by_xpath("//input[contains(@value,'领取')]")
    ActionChains(driver).move_to_element(dailyButton).click(dailyButton).perform()

参考资料


Python 生成随机数

# coding:utf-8
import time
import random

time.sleep(random.randint(4,9))

这里我用了 random 模块的 randint() 函数来生成随机数,每次执行后都返回不同的数字(4到 9)。

函数的语法为:

random.randint(a,b)

函数返回数字 N ,N 为 a 到 b 之间的数字(a <= N <= b),包含 a 和 b。

参考资料


Let's Encrypt

简介

Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。

Let’s Encrypt已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被Mozilla、Google、Microsoft和Apple等主流的浏览器所信任,你只需要在Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let’s Encrypt安装简单,未来大规模采用可能性非常大。

Let’s Encrypt 每次只有 90 天的有效期,可以通过脚本定期更新,配好之后一劳永逸。

生成证书

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto

运行后得到这样的提示:

提示无法自动配置 apache,因为我根本就没装2333333 不用在意,按照它的提示运行命令

./letsencrypt-auto certonly

按照提示输入一些基本信息,就生成 ssl 文件啦!

可以看到生成的文件在:/etc/letsencrypt/live/ 这样的文件夹下。fullchain.pem就是公钥,privkey.pem就是私钥。有了这两个文件我们就可以在Ngnix上配置SSL证书了。

配置Nginx

在 server 模块加上下面内容

listen 443;
...

ssl on;
ssl_certificate /etc/letsencrypt/live/xxx/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;

重新加载配置即可。

参考资料


Linux 测试端口通不通

说到端口通不通,大部分人第一反应都是 ping。可惜ping命令是不能够测试端口的,只是测试网络联接状况以及信息包发送和接收状况。

我们需要用 telnet 命令。telnet 是 windows 标准服务,可以直接用;如果是 linux 机器,需要安装 telnet.

用法: telnet ip port

1)先用telnet连接不存在的端口

[root@localhost ~]# telnet 10.0.250.3 80
Trying 10.0.250.3...
telnet: connect to address 10.0.250.3: Connection refused #直接提示连接被拒绝

2)再连接存在的端口

[root@localhost ~]# telnet localhost 22
Trying ::1...
Connected to localhost. #看到Connected就连接成功了
Escape character is '^]'.
SSH-2.0-OpenSSH_5.3
a
Protocol mismatch.
Connection closed by foreign host.

Mac 下停止 PostgreSQL 服务

在 Mac 下有很多种方式可以安装 PostgreSQL 。比如源码安装、homebrew 安装,dmg 包安装。 现在想起来,我应该用 homebrew 安装——还是命令行可控性强一些。当时觉得方便,使用官网提供的 dmg 包安装,然后问题就来了:无法停止 PostgreSQL。

参照网上的办法,使用了下面这个命令:

/Library/PostgreSQL/9.6/bin/pg_ctl -D /Library/PostgreSQL/9.6/bin/postgres stop -s -m fast

出现了这样的错误:

pg_ctl: could not open PID file "/Library/PostgreSQL/9.6/bin/postgres/postmaster.pid": Not a directory

无法找到 postmaster.pid 的位置。后来也找了一系列的办法,都不行。好在竟然在 github 上找到了 gui 界面停止的办法—— MaccaTech/PostgresPrefs

安装办法很简单,下载 GUI 后点击安装,会在系统偏好设置里生成管理图标,就可以在里边进行开启、停止的操作啦!

参考资料