自费购买云服务器绝对是一种经济负担, 使用免费服务器资源无不是一种很有吸引力的选择, 问题在于免费的服务器资源一般都要续期
所以我写了个脚本来自动白嫖免费服务器...

阅读之前

请确保你有这些东西:

  • 一个手机号
  • 1 到 3 元钱 (用于实名认证)
  • 对数据随时丢失 & 服务不稳定的心理准备
  • 不能搭建 http(s) 网站的心理准备 (除非你有一个已经备案的域名, 三丰云的免备案简直没法用, 但是 tcp 连接不受限制)
  • 基本的 Linux 服务器管理技能

第一步:注册并登录三丰云

此过程略
记得设置管理员密码
系统选择 Ubuntu 16.04(这是三丰云提供的最新系统版本, 凑合用罢). 不要选 Windows, 太耗资源了.
此时你已经可以通过 ssh 管理服务器了, 关于管理服务器, 本文不再赘述
另外第一次续期时间点设置很反人类, 先手动过一下, 后面就可以自动化了

第二步:使用自动续期脚本

先说明一下, 这个脚本虽然理论上可以在你的免费服务器运行, 但是不建议这么做 首先, 因为系统版本低的缘故, 你要手动编译安装 Python 3.7.5, 因为系统自带的最高版本是 Python 3.5, 而且就算你搞好了 Python 环境, 你还要处理 Geckodriver 和老旧火狐浏览器版本一类的破事, 是真的麻烦.
其次, 就算你手动或者用 docker 啥的配好了所有环境, 开心跑脚本提交续期的时候, 你会发现你的续期图片的 IP 地址是北京什么公司, 过不了审核的
个人建议可以在自己的电脑/手机/家庭服务器上整个 Linux 环境的计划任务运行脚本 (理论上 Windows 也可以运行, 但是我没做测试)
如果实在没有设备, 还可以借助 Vercel 的部署脚本在你的免费服务器上整个计划 git commit 运行, 但是这需要你的配置

第三步:部署脚本并运行

  1. 从软件源安装 FireFox Python 3.7 或更高 (记得安装 python3-dev python3-pip) (debian 上貌似只有 firefox-esr, 也能用) 如果你要搞计划任务还要安装 cron, 本文不再赘述
  2. 使用 pip3 安装依赖包: selenium
  3. 创建一个目录, 按文件名放置脚本文件
# run.sh
rm -rf result.png
python3 webposter.py && python3 imgeditor.py && python3 webuploader.py
rm -rf scrst.png
rm -rf upload.png
rm -rf geckodriver.log
# imgeditor.py
from PIL import Image

def crop_image(input_path, output_path, left, upper, right, lower):
    try:
        image = Image.open(input_path)
        cropped_image = image.crop((left, upper, right, lower))
        cropped_image.save(output_path)
        print("[LOG] 成功生成上传图片")
    except FileNotFoundError:
        print("[ERROR] 找不到输入图片")
    except Exception as e:
        print("[ERROR] 裁剪图片时出错", str(e))

print("+-- IMGEDITOR --+")
print("执行任务: 编辑图片文件")
print("任务目标: 生成上传图片")

input_path = "scrst.png"
output_path = "upload.png"
left = 180
upper = 13
right = 1131
lower = 309
crop_image(input_path, output_path, left, upper, right, lower)
print("[LOG] 成功生成上传图片")
# webposter.py
import random
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

print("+-- WEBPOSTER --+")
print("执行任务: 发送续期信息")
print("任务目标: 生成原始截图")

URL = "http://www.adminxy.com/showidc-4335.asp"
NAMEAREA_XPATH = "/html/body/div[2]/div[2]/div[1]/div[4]/div[4]/div[3]/form/table/tbody/tr[1]/td[2]/input"
TEXTAREA_XPATH = "/html/body/div[2]/div[2]/div[1]/div[4]/div[4]/div[3]/form/table/tbody/tr[4]/td[2]/textarea"
A1_XPATH = "/html/body/div[2]/div[2]/div[1]/div[4]/div[4]/div[3]/form/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[2]/div/ul/li[5]/a"
A2_XPATH = "/html/body/div[2]/div[2]/div[1]/div[4]/div[4]/div[3]/form/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[1]/div/ul/li[5]/a"
A3_XPATH = "/html/body/div[2]/div[2]/div[1]/div[4]/div[4]/div[3]/form/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[1]/div/ul/li[5]/a"
A4_XPATH = "/html/body/div[2]/div[2]/div[1]/div[4]/div[4]/div[3]/form/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/div/ul/li[5]/a"
BTN1_XPATH = "/html/body/div[2]/div[2]/div[1]/div[4]/div[4]/div[3]/form/table/tbody/tr[5]/td[2]/input"
TEXT_LIST = [ # 这是 GPT 生成的广告词, 可以自己多搞几条
"三丰云的免费云服务器真是太棒了!连接速度快,稳定性和性能出色,完全满足我的需求。而且,使用起来也非常方便,还永久免费!强烈推荐给需要高质量云服务器的人们!",
"我尝试了三丰云的免费云服务器,它真是太赞了!连接速度快得让我惊艳,而且使用起来非常方便。最重要的是,它永久免费!三丰云的服务质量真是一流,让我非常满意!",
"免费云服务器果然名不虚传!我用了三丰云的产品,速度快得令人难以置信!能够永久免费使用,真的太实惠了!三丰云的免费虚拟主机和云服务器绝对是必备工具,推荐给大家!",
"三丰云的免费云服务器真是太好用了!我用它托管我的网站和应用,连接速度超快,且非常稳定。而且,它的免费性质让我感到惊喜!无论个人用户还是企业用户,都值得选择三丰云!",
"三丰云的免费云服务器简直是太棒了!我用它来托管我的网站和应用,连接速度超快,绝对能满足我的需求。同时,它还是永久免费的,物超所值!大家一定要抓住这个机会,亲自体验一下!",
"三丰云的免费云服务器真是太实用了!我用它来测试我的应用,连接速度快得让我惊叹不已。而且,它还是永久免费的,非常适合个人用户和企业用户。选择三丰云,你绝对不会后悔!",
"作为免费云服务器的提供商,三丰云真是值得称赞!它的连接速度极快,简直令人难以置信。而且,使用起来非常方便,而且永久免费!三丰云的产品真的是个人用户和企业用户的不二选择!",
"三丰云的免费云服务器真是太强大了!连接速度快,性能出色,能够满足各种需求。而且,它免费使用,简直太实惠了!如果你需要云服务器,一定不能错过三丰云!",
"三丰云的免费云服务器真是让我无法抗拒!连接速度极快,稳定性也非常好。它的免费特性更是令人惊喜!使用起来非常方便,真的是个人用户和企业用户的不二选择!",
"三丰云的产品让我感受到了极致的便利和高效。不仅连接速度飞快,而且免费!这是一款真正物超所值的产品,你一定不要错过!",
"三丰云的免费云服务器真是太厉害了!我使用它来托管我的网站和应用,连接速度快得让我震惊!而且,它是永久免费的!选择三丰云,你绝对会感到满意!",
"我对三丰云的免费云服务器赞不绝口!连接速度快得让人难以置信,使用起来也非常方便!是个人用户和企业用户的最佳选择!选择三丰云,你一定会获得绝佳的体验!",
"三丰云的免费云服务器真是太强大了!我使用它来托管我的网站和应用,效果非常好!连接速度快,稳定性和性能都很出色。而且,它的免费性质让我更加喜爱!强烈推荐给大家!",
"作为永久免费服务器的提供商,三丰云真是无可挑剔!我使用它的免费云服务器,速度超快,稳定性很好。而且,它的免费性质真的让我感到惊喜!三丰云绝对是你值得选择的品牌!"
]

options = Options()
options.add_argument("--headless") # 无头模式
driver = webdriver.Firefox(options=options)

driver.get(URL)
name_input = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, NAMEAREA_XPATH)))
name_input.clear()
name_input.send_keys("你的发帖名字")

text_input = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, TEXTAREA_XPATH)))
text_input.send_keys(random.choice(TEXT_LIST).replace("三丰云", "三.丰.云."))

ele1 = driver.find_element(By.CSS_SELECTOR,"#stars1 .five-stars");
ele2 = driver.find_element(By.CSS_SELECTOR,"#stars2 .five-stars");
ele3 = driver.find_element(By.CSS_SELECTOR,"#stars3 .five-stars");
ele4 = driver.find_element(By.CSS_SELECTOR,"#stars4 .five-stars");
driver.execute_script("arguments[0].click();", ele1)
driver.execute_script("arguments[0].click();", ele2)
driver.execute_script("arguments[0].click();", ele3)
driver.execute_script("arguments[0].click();", ele4)

button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, BTN1_XPATH)))
button.click()
print("[LOG] 消息发送成功")
# 截图
driver.get(URL)
driver.execute_script("window.scrollBy(0, 640);")
driver.save_screenshot("scrst.png")
print("[LOG] 原始截图获取成功")
driver.quit()
# webuploader.py
import os
from time import sleep
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
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
print("+-- WEBUPLOADER --+")
print("执行任务: 上传图片文件")
print("任务目标: 完成自动续期")
# 定义需要的常量
NAMEAREA_XPATH = "/html/body/div[4]/div[1]/div[1]/div/div/div[2]/form/div[1]/input"
PWDAREA_XPATH = "/html/body/div[4]/div[1]/div[1]/div/div/div[2]/form/div[2]/input"

# 初始化Firefox驱动
options = Options()
options.add_argument("--headless") # 无头模式
driver = webdriver.Firefox(options=options)
actions = ActionChains(driver)
# 登录
print("[LOG] 准备登录")
driver.get("https://www.sanfengyun.com/login")
# 在页面上随意滑动鼠标
action_chains = ActionChains(driver)
action_chains.move_by_offset(50, 50).perform()
action_chains.move_by_offset(50, 50).perform()
action_chains.move_by_offset(10, 53).perform()
sleep(3)
jscmd = """
document.getElementById("userName").value = "你的注册手机号";
document.getElementById("passwordInput").value = "你的三丰云密码";
document.getElementById("loginSubmit").click();
"""
driver.execute_script(jscmd)
sleep(3)
# 自动延期
driver.get("三丰云服务器的控制面板页面链接") # 像这样"https://www.sanfengyun.com/control/#/freeServer/一串数字"
print("[LOG] 准备自动延期")
link1 = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div/div[2]/div[2]/div[2]/div/div[4]/div[1]/div/div/div/div[8]")))
actions.move_to_element(link1).click().perform()

try:
    print("[LOG] 开始自动续期")
    addr_input = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "/html/body/div/div[2]/div[2]/div[2]/div/div[4]/div[2]/div[8]/form[1]/div/div/div/input")))
    addr_input.clear()
    addr_input.send_keys("http://www.adminxy.com/showidc-4335.asp")
    driver.find_element(By.ID,"fileImg1").send_keys(os.path.abspath("upload.png"))
    button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div/div[2]/div[2]/div[2]/div/div[4]/div[2]/div[8]/form[2]/div/div/button")))
    sleep(5)
    button.click()
    sleep(5)
    driver.save_screenshot("result.png")
    print("[LOG] 已生成网页结果截图")
    driver.quit()
except:
    try:
        notfoundinf = driver.find_element(By.XPATH,"/html/body/div/div[2]/div[2]/div[2]/div/div[4]/div[2]/div[8]/form[2]/div/div/div/p[2]")
        print("[LOG] 未到时间")
        sleep(4)
        print(notfoundinf.text)
        sleep(4)
        driver.quit()
        exit()
    except:
        print("[ERROR] 程序出错")
        driver.quit()
        exit()
  1. 在 webposter.py 里把"你的发帖名字"改成你想要的网名.
  2. 在 webupload.py 里把账号信息和面板链接填完整
  3. 执行 run.sh 试试, 没问题就设置计划任务吧 :)

标签: 不务正业

添加新评论