通过fidder抓包,然后写的python脚本。
采集文章后,然后发布到网站,很是方便。
但是这个脚本只适合本站使用。
目前把代码放在这里,留作备份。
import requests
import pandas as pd
import re
import time
import os
import json
# ---------- 配置 ----------
EXCEL_PATH = r"C:\Users\18102\Downloads\jietu\1.xlsx"
AJAX_URL = "https://www.4s5.cn/wp-admin/admin-ajax.php"
CATEGORY_ID = 41
EXCEL_DIR = os.path.dirname(EXCEL_PATH)
PUBLISHED_LOG = os.path.join(EXCEL_DIR, "published.txt")
LOG_PATH = os.path.join(EXCEL_DIR, "publish.log")
# 完整的 Cookie(请确保有效)
COOKIE_STRING = ""
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Referer": "https://www.4s5.cn/newposts",
"Origin": "https://www.4s5.cn",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": COOKIE_STRING,
}
RECOMMENDED_ARTICLES = [
("1790", "PbootCMS 安全运维完全指南"),
("1788", "pbootcms源码安装教程,后台密码,页面空白处理"),
("1785", "pbootcms伪静态设置教程"),
]
# ---------- 辅助函数 ----------
def extract_id_and_title(filename):
match = re.match(r'^(\d{4})_(.+?)\.zip$', filename)
if match:
return int(match.group(1)), match.group(2)
return None, filename
def build_post_content(desc, site_id):
if desc and isinstance(desc, str) and len(desc.strip()) > 10:
sentences = [s.strip() for s in desc.split('。') if s.strip()]
desc_html = ''.join([f'<p>{s}。</p>' for s in sentences])
else:
desc_html = '<p>这是一款优质的PbootCMS网站模板,适合各类企业建站需求。模板设计美观,功能完善,欢迎下载使用。</p>'
img_url = f"https://www.4s5.cn/wp-content/uploads/{site_id:04d}.com.png"
img_html = f'<h3>模板展示</h3><p><img src="{img_url}" alt="模板截图"></p>'
install_html = '''
<h3>安装说明</h3>
<p>网站后台:/admin.php</p>
<p>账号:admin</p>
<p>密码:admin</p>
'''
password_html = '<p>解压密码:www.4s5.cn</p>'
rec_html = '<h3>相关文章</h3><ul>'
for post_id, title in RECOMMENDED_ARTICLES:
rec_html += f'<li><a href="https://www.4s5.cn/archives/{post_id}.html" target="_blank">{title}</a></li>'
rec_html += '</ul>'
return desc_html + img_html + install_html + password_html + rec_html
# ---------- 日志记录 ----------
def log_response(site_id, response_text, success_flag=False):
with open(LOG_PATH, 'a', encoding='utf-8') as f:
f.write(f"=== Site {site_id:04d} ===\n")
f.write(response_text + "\n")
f.write("--- 标记为成功 ---\n" if success_flag else "--- 标记为失败 ---\n")
f.write("\n")
# ---------- 已发布记录管理 ----------
def load_published_ids():
if not os.path.exists(PUBLISHED_LOG):
return set()
with open(PUBLISHED_LOG, 'r', encoding='utf-8') as f:
return {line.strip() for line in f if line.strip()}
def save_published_id(site_id):
with open(PUBLISHED_LOG, 'a', encoding='utf-8') as f:
f.write(f"{site_id:04d}\n")
# ---------- 主程序 ----------
def main():
published_ids = load_published_ids()
print(f"📋 已发布 {len(published_ids)} 篇。")
df = pd.read_excel(EXCEL_PATH)
df = df.sort_values('站点id').reset_index(drop=True)
print(f"📊 Excel 共 {len(df)} 条记录。")
auto_mode = False # 是否自动发布模式
for idx, row in df.iterrows():
site_id = int(row['站点id'])
site_id_str = f"{site_id:04d}"
if site_id_str in published_ids:
print(f"⏭️ 站点 {site_id_str} 已发布,跳过。")
continue
filename = row['文件名']
link = row['链接']
desc = row.get('描述', '')
sid, title_part = extract_id_and_title(filename)
if sid is None:
print(f"❌ 文件名格式错误:{filename},跳过。")
continue
if not auto_mode:
print(f"\n📌 当前准备发布:{site_id_str} - {title_part}")
print(" 选项:")
print(" 按 回车 → 发布")
print(" 输入 2 → 跳过(不记录)")
print(" 输入 3 → 退出脚本")
print(" 输入 4 → 自动发布(此后不再询问)")
choice = input("请选择:").strip()
if choice == '3':
print("🛑 用户选择退出。")
break
elif choice == '4':
auto_mode = True
print("🚀 已切换为自动发布模式,将连续发布所有剩余站点。")
# 当前站点继续发布(不跳过)
elif choice == '2':
print(f"⏭️ 跳过站点 {site_id_str}。")
continue
elif choice == '':
# 回车,发布
pass
else:
print("输入无效,按回车键将视为发布。")
# ---------- 执行发布 ----------
title = f"{title_part} {sid:04d}"
content = build_post_content(desc, site_id)
pay_download = {
"link": link,
"more": "解压密码:www.4s5.cn",
"copy_key": "解压密码",
"copy_val": "www.4s5.cn",
"name": "百度网盘下载",
"class": ""
}
data = {
"post_title": title,
"post_content": content,
"category[]": CATEGORY_ID,
"tags": "",
"zibpay_s": "on",
"posts_zibpay[pay_modo]": "0",
"posts_zibpay[pay_price]": "0",
"posts_zibpay[vip_1_price]": "0",
"posts_zibpay[vip_2_price]": "0",
"posts_zibpay[pay_download][0][link]": pay_download["link"],
"posts_zibpay[pay_download][0][more]": pay_download["more"],
"posts_zibpay[pay_download][0][name]": pay_download["name"],
"posts_zibpay[pay_download][0][copy_key]": pay_download["copy_key"],
"posts_zibpay[pay_download][0][copy_val]": pay_download["copy_val"],
"posts_zibpay[pay_download][0][class]": pay_download["class"],
"posts_id": "0",
"action": "posts_save"
}
try:
resp = requests.post(AJAX_URL, headers=HEADERS, data=data, timeout=30)
resp_text = resp.text
try:
result = resp.json()
except:
result = {}
# 成功判断
success = False
if result.get('posts_id'):
success = True
elif result.get('error') == False:
success = True
elif '已发布' in result.get('msg', ''):
success = True
log_response(site_id, resp_text, success_flag=success)
if success:
post_id = result.get('posts_id', '未知')
print(f"✅ 发布成功!站点 {site_id_str} -> 文章ID {post_id}")
save_published_id(site_id)
published_ids.add(site_id_str)
else:
error_msg = result.get('msg', '未知错误')
print(f"❌ 发布失败!站点 {site_id_str},错误:{error_msg}")
except Exception as e:
print(f"❌ 异常:{e},站点 {site_id_str}")
with open(LOG_PATH, 'a', encoding='utf-8') as f:
f.write(f"=== Site {site_id:04d} ===\n")
f.write(f"EXCEPTION: {str(e)}\n\n")
time.sleep(1.5)
print(f"\n🏁 脚本执行完毕。已发布 {len(load_published_ids())} 篇。")
if __name__ == "__main__":
main()
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END





![表情[aoman]-红穆笔记](https://www.4s5.cn/wp-content/themes/zibll/img/smilies/aoman.gif)



暂无评论内容