Typecho 插件开发指南:从零开始实现文章同步功能

教主
2月22日发布 /正在检测是否收录...

Typecho 插件开发指南:从零开始实现文章同步功能

1. 插件目录结构

Typecho 插件需要放置在 usr/plugins/ 目录下。每个插件是一个独立的文件夹,文件夹名称就是插件的唯一标识。

例如,创建一个名为 SyncToPlatform 的插件:


usr/plugins/SyncToPlatform/
├── Plugin.php       // 插件主文件
├── LICENSE          // 插件许可证
└── README.md        // 插件说明文档
    

2. 插件主文件 (Plugin.php)

插件的核心逻辑写在 Plugin.php 文件中。以下是一个简单的插件示例,用于在文章发布时触发同步操作。


<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;

class SyncToPlatform_Plugin implements Typecho_Plugin_Interface
{
    /**
     * 激活插件
     */
    public static function activate()
    {
        // 挂载文章发布事件
        Typecho_Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = array('SyncToPlatform_Plugin', 'syncPost');
        return _t('插件已激活');
    }

    /**
     * 禁用插件
     */
    public static function deactivate()
    {
        return _t('插件已禁用');
    }

    /**
     * 插件配置面板
     */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        // 添加 Medium API Token 输入框
        $apiToken = new Typecho_Widget_Helper_Form_Element_Text('apiToken', NULL, '', _t('Medium API Token'), _t('请输入你的 Medium API Token'));
        $form->addInput($apiToken);

        // 添加用户 ID 输入框
        $userId = new Typecho_Widget_Helper_Form_Element_Text('userId', NULL, '', _t('Medium 用户 ID'), _t('请输入你的 Medium 用户 ID'));
        $form->addInput($userId);
    }

    /**
     * 个人用户的配置面板
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form)
    {
        // 不需要个人配置
    }

    /**
     * 文章发布时同步到 Medium
     */
    public static function syncPost($contents, $class)
    {
        // 获取插件配置
        $options = Typecho_Widget::widget('Widget_Options');
        $pluginConfig = $options->plugin('SyncToPlatform');
        $apiToken = $pluginConfig->apiToken;
        $userId = $pluginConfig->userId;

        if (empty($apiToken) || empty($userId)) {
            return;
        }

        // 准备文章数据
        $title = $contents['title'];
        $content = $contents['text'];
        $tags = isset($contents['tags']) ? explode(',', $contents['tags']) : [];

        // 调用 Medium API 发布文章
        $url = "https://api.medium.com/v1/users/{$userId}/posts";
        $data = [
            'title' => $title,
            'contentFormat' => 'markdown',
            'content' => $content,
            'tags' => $tags,
            'publishStatus' => 'public' // 或 'draft'
        ];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $apiToken,
            'Content-Type: application/json'
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        $response = curl_exec($ch);
        curl_close($ch);

        // 记录日志(可选)
        file_put_contents(__TYPECHO_ROOT_DIR__ . '/usr/plugins/SyncToPlatform/log.txt', $response . PHP_EOL, FILE_APPEND);
    }
}
    

3. 插件配置

在 Typecho 后台的“插件”页面,找到 SyncToPlatform 插件并激活。

进入插件设置页面,输入你的 Medium API Token 和用户 ID。

4. 测试插件

在 Typecho 中发布一篇文章,插件会自动调用 Medium API 将文章同步到 Medium。

检查 Medium 账号,确认文章是否成功发布。

扩展功能

  • 支持更多平台:可以在 syncPost 方法中添加其他平台的 API 调用逻辑(如 CSDN、知乎等)。
  • 错误处理:增加对 API 调用失败的处理,例如重试或记录错误日志。
  • 自定义发布状态:允许用户选择文章发布状态(公开或草稿)。

注意事项

  • API 限制:不同平台的 API 可能有调用频率限制,注意不要频繁调用。
  • 安全性:确保 API Token 等敏感信息的安全,不要泄露。
  • 格式兼容性:不同平台对内容的格式要求不同,可能需要调整文章内容。

更多技术分享和实用教程,欢迎访问我的博客:6v6 博客,一起探索技术的无限可能!

喜欢就支持一下吧
点赞 0 分享 赞赏
评论 共4条
OωO
取消 登录评论
  1. 头像
    YSPLL
     · 

    还可以使用csdn吗,教主

    1. 头像
      教主 作者
       · 

      @YSPLL

      csdn的我已经研究了个更好的了,不过目前还先不发,这次的可以下载付费的文章,和积分类的

      1. 头像
        YSPLL
         · 

        @教主

        还能得到教主的回复,真是太激动了=。能有机会提前了解教主您正在研究的内容,对我来说真是一次难得的机会。希望可以体验下,可以付费使用,非常期待教主您的分享。

  2. 头像
    YSPLL
     · 

    csdn那个现在怎么用不了,教主

i
Ctrl+D 收藏本站 再次访问不迷路~