红穆笔记
首頁 語言筆記 python批量將文章發佈到wordpress子比主題
語言筆記 python

python批量將文章發佈到wordpress子比主題

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()
微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

Import "requests" could not be resolved from source

Import "requests" could not be resolved from source 語言筆記 python

這個報錯是在使用Pylance這個Python語言服務器時出現的。其中,"Import "requests" could not be resolved from source"這個錯誤提示表示在你的代碼中引用了requests模塊,但是Pylance無法從源中找到該模塊的位置。可能的原因是你沒有安…
👁 1771
重新安装Python和requests库

重新安裝Python和requests庫 語言筆記 python

如果您遇到了 "Import "requests" could not be resolved from source" 的問題,可以嘗試重新安裝 Python 和 requests 庫。首先,您需要卸載當前的 Python 和 requests 庫。在 Windows 系統上,您可以通過在命令提示…
👁 439
WARNING: Skipping requests as it is not installed.

WARNING: Skipping requests as it is not installed. 語言筆記 python

這個錯誤提示說明你的Python環境中缺少requests庫,而你的代碼中又調用了這個庫,因此Python無法正常執行你的代碼。解決這個問題的方法是安裝requests庫。你可以在命令行中使用pip命令來安裝:pip install requests如果你使用的是Python3,可以使用pip3命令…
👁 2100
python报错,这是什么原因?AttributeError: partially initialized module 'openai' has no attribute 'Completion' (most likely due to a circular import)

python報錯,這是什麼原因?AttributeError: partially initialized module 'openai' has no attribute 'Completion' (most likely due to a circular import) 語言筆記 python

這個錯誤提示表明在導入 openai 模塊和特定的 Completion 屬性時出現了問題,很可能是由於循環導入導致的。出現這個錯誤的原因可能是你的代碼中存在兩個或多個模塊之間相互導入,形成了循環依賴。例如,模塊A導入了模塊B,而模塊B又導入了模塊A。循環導入會導致模塊在加載時無法正確地初始化,從而…
👁 656
python如何打包在Windows上运行?

python如何打包在Windows上運行? 語言筆記 python

在Windows上打包和運行Python程序的最常用方式是使用PyInstaller。PyInstaller是一個免費的、跨平臺的Python應用程序打包工具,可以將Python代碼和其依賴的庫打包成一個獨立的可執行文件,使得在沒有安裝Python解釋器的系統上運行Python程序成爲可能。以下是使…
👁 300
python开发用什么编程软件好?

python開發用什麼編程軟件好? 語言筆記 python

Python開發的編程軟件有很多,以下是一些常用的Python集成開發環境(IDE)和編輯器:PyCharmPyCharm是一個由JetBrains開發的集成開發環境,它專爲Python開發者設計。PyCharm功能強大,提供了代碼補全、調試、版本控制、代碼重構等一系列高級功能,可以幫助開發者提高工…
👁 175

推薦閱讀

响应式精品皮具高端箱包网站模板 0416

響應式精品皮具高端箱包網站模板 0416 實用收藏 易優模板

此套eyoucms響應式模板適用於精品皮具與高端箱包行業,設計風格高端時尚,能夠展示皮具箱包產品、品牌故事、設計理念及定製服務。有助於皮具品牌在線上展示產品,吸引品質生活消費者。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結…
👁 55
(PC+WAP)蓝色电缆桥架类网站PbootCMS模板 电缆钢结构五金机械网站源码下载 0567

(PC+WAP)藍色電纜橋架類網站PbootCMS模板 電纜鋼結構五金機械網站源碼下載 0567 實用收藏 pbootcms模板

一款針對電纜橋架與鋼結構五金機械行業的PbootCMS藍色通用模板,支持PC和WAP端訪問。設計風格清晰務實,適合展示橋架、母線槽等產品。有助於電纜橋架製造企業在線上搭建專業的品牌官網與產品展示平臺。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:w…
👁 52
响应式广告设计创意公司网站模板 1123

響應式廣告設計創意公司網站模板 1123 實用收藏 易優模板

一款針對廣告設計與創意公司的eyoucms響應式網站模板。設計風格創意視覺,能夠展示廣告設計作品、創意案例、品牌策劃及服務內容。有助於廣告公司在線上展示專業實力,吸引品牌客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易…
👁 46
mysql中,ibtmp1这个文件怎么限制,不让他一直变大

mysql中,ibtmp1這個文件怎麼限制,不讓他一直變大 踩坑總結

在MySQL中,臨時表空間文件 ibtmp1 是一個動態變化的文件,實際大小是根據實際需要動態生成的。如果這個文件沒有受到適當的管理和限制,可能會不斷變大,最終佔用大量磁盤空間。因此,你可以使用以下方法來限制 ibtmp1 文件:爲 my.cnf 文件添加 innodb_temp_data_file…
👁 379
西服职业装定制网站模板 0073

西服職業裝定製網站模板 0073 實用收藏 易優模板

一款針對西服與職業裝定製行業的eyoucms網站模板。設計風格高端專業,能夠展示西裝定製、職業裝設計及企業團購服務。有助於服裝定製品牌在線上吸引企業客戶,展示工藝與案例。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CM…
👁 46
(自适应手机端)pbootcms钢材加工网站模板 钢材切割钢材销售网站源码下载 0227

(自適應手機端)pbootcms鋼材加工網站模板 鋼材切割鋼材銷售網站源碼下載 0227 實用收藏 pbootcms模板

本套自適應手機端的PbootCMS鋼材加工與鋼材銷售網站模板。設計風格硬朗專業,能夠展示鋼材產品規格、加工服務及庫存信息。有助於鋼材貿易企業在線上展示實力,吸引建築與製造客戶。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn相關文…
👁 44