python批量将文章发布到wordpress子比主题

通过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
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容