跳到主要内容

🚗 API开发文档

emlog pro版本支持接口(API)调用功能,开发者可以通过调用API来和emlog系统进行交互。如:对接文章发布软件,实现自动发布文章;对接微信小程序,实现多样化的文章展示;对接浏览器插件实现更便捷的笔记发布功能等。详细接口说明请参看下文内容。

提示

该文档以最新版本emlog pro为基础编写,低版本可能不兼容,请先升级到最新版本,并在后台api设置页面开启api。

接口鉴权

(1)API秘钥鉴权:签名鉴权

  • 请求方式:POST/GET
  • 鉴权所需参数:
参数是否必填描述
req_sign必填接口签名,见下方计算签名规则
req_time必填Unix时间戳,php可使用time()函数获取,如:1651591816

计算签名规则

将 unix时间戳 和 API秘钥 拼接后进行md5加密,API秘钥,在后台系统-设置-API 设置页面可以找到

php代码示例:

$apikey = '******'; // API秘钥,在后台系统-设置-API 设置页面可以找到
$req_time = time(); // unix时间戳, 单位秒
$req_sign = md5($req_time . $apikey); // MD5签名

(2)API秘钥鉴权:免签名鉴权

使用简单,但是安全性不如签名鉴权,建议配合https使用

  • 请求方式:POST/GET
  • 鉴权所需参数:
参数是否必填描述
api_key必填API秘钥,在后台系统-设置-API 设置页面可以找到

(3)cookie鉴权

请求需要附带用户登录emlog系统后的登录状态cookie,用来识别当前登录状态及登录用户。

// emlog登录状态cookie形如:
EM_AUTHCOOKIE_XXXXX=admin%7C0%7C2a12e9a651b7e44be3d2d3536f51eaaa; Path=/; HttpOnly;

API列表

用户登录

参数是否必填描述
user必填用户名、邮箱
pw必填密码
persist记住我,保留登录状态(传值:1)
login_code图片验证码
resp必填传递字符串 "json"

返回结果(同时附带登录成功cookie)

{
"code": 0,
"msg": "ok",
"data": ""
}

用户注册

参数是否必填描述
mail必填邮箱
passwd必填密码
repasswd必填重复密码
login_code图片验证码
mail_code邮件验证码
resp必填传递字符串 "json"

返回结果

{
"code": 1,
"msg": "错误的邮箱格式",
"data": ""
}

找回密码:验证注册邮箱

参数是否必填描述
mail必填邮箱
login_code图片验证码
resp必填传递字符串 "json"

返回结果

{
"code": 0,
"msg": "ok",
"data": ""
}

找回密码:重置密码

参数是否必填描述
mail_code邮件验证码
passwd必填密码
repasswd必填重复密码
resp必填传递字符串 "json"

返回结果

{
"code": 0,
"msg": "ok",
"data": ""
}

获取当前登录用户信息

  • 获取当前登录用户信息接口
  • 接口URL:https://yourdomain/?rest-api=userinfo
  • 请求方式:GET
  • 接口鉴权方式:【cookie鉴权】
  • 返回格式:JSON
  • 请求参数:无

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"userinfo": {
"uid": "1",
"nickname": "emer",
"role": "admin",
"photo": "../content/uploadfile/202303/ad7b1678085402.jpg",
"email": "",
"description": "",
"ip": "172.18.0.1",
"create_time": "1677640065"
}
}
}

获取用户信息

参数是否必填描述
id用户id

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"userinfo": {
"uid": 1,
"nickname": "emer",
"role": "admin",
"avatar": "http://localhost/content/uploadfile/202408/ad7b1723864764.jpg",
"description": "",
"create_time": 1723271947
}
}
}

修改用户信息

参数是否必填描述
name昵称
email登录邮箱
description个人说明
username登录用户名
newpass新的密码,修改密码时传递
repeatpass重新输入新密码,修改密码时传递

返回结果

{
"code": 0,
"msg": "ok",
"data": ""
}

上传头像

参数是否必填描述
image表单提交的图片, PHP 获取:$_FILES["image"]

返回结果

{
"code": 0,
"msg": "ok",
"data": "..\/content\/uploadfile\/202310\/ad7b1696580183.jpg"
}

发布评论

参数是否必填描述
gid必填文章id
comname必填评论人名称
comment必填评论内容
commail评论人邮箱
comurl评论人主页地址
avatar评论人头像图片 URL
imgcode图片验证码
pid被回复评论ID
resp必填传递字符串 "json"

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"cid": 4
}
}

评论列表

参数是否必填描述
id文章ID
page评论分页,需后台设置开启评论分页功能

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"comments": {
"1": {
"cid": "1",
"gid": "1",
"pid": "0",
"top": "n",
"poster": "snow",
"uid": "0",
"comment": "stay hungry stay foolish",
"mail": "",
"url": "",
"ip": "",
"agent": "",
"hide": "n",
"date": "57 分钟前",
"content": "stay hungry stay foolish",
"children": [],
"level": 0
}
},
"commentStacks": [],
"commentPageUrl": ""
}
}

评论列表-v2

参数是否必填描述
id文章id

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"comments": [
{
"cid": "1",
"gid": "1",
"pid": "0",
"top": "n",
"poster": "emlog",
"avatar": "http://localhost:8080/admin/views/images/avatar.svg",
"uid": "0",
"comment": "这是系统生成的演示评论",
"mail": "",
"url": "",
"ip": "",
"agent": "",
"hide": "n",
"date": "2024-09-28 22:06",
"content": "这是系统生成的演示评论",
"children": [
{
"cid": "2",
"gid": "1",
"pid": "1",
"top": "n",
"poster": "emer",
"avatar": "http://localhost:8080/",
"uid": "1",
"comment": "@emlog:这是测试评论",
"mail": "",
"url": "http://localhost:8080/",
"ip": "192.168.65.1",
"agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
"hide": "n",
"date": "3 秒前",
"content": "@emlog:这是测试评论",
"children": []
}
]
}
]
}
}

点赞

参数是否必填描述
gid文章id
name点赞人名称
avatar点赞人头像图片 URL

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"id": 2
}
}

获赞列表

参数是否必填描述
id文章id

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"likes": [
{
"id": 1,
"gid": 1,
"poster": "snowsun",
"avatar": "https://oss.emlog.cn/avatar/avatar_y4LueUW71K3rIvxn.png?imageMogr2/thumbnail/200x",
"uid": 0,
"ip": "192.168.65.1",
"agent": "PostmanRuntime/7.41.2",
"date": "约 9 小时前"
}
]
}
}

文章发布

  • 文章发布接口,可用于对接文章发布软件
  • 接口URL:https://yourdomain/?rest-api=article_post
  • 请求方式:POST
  • 接口鉴权方式:【API秘钥鉴权】 或者 【cookie鉴权】
  • 返回格式:JSON
  • 请求参数:
参数是否必填描述
title必填文章标题
content必填文章内容
excerpt文章摘要
cover文章封面
author_uid作者的用户ID,可在后台用户管理页面查看
sort_id文章分类ID,可在后台分类管理页面查看
tags文章标签,多个半角逗号分隔,如:PHP,MySQL
draft是否发布为草稿,是y, 否n (默认为n)
post_date发布时间,如:2022-05-03 23:30:16
field_keys[]自定义字段名称,如价格:price
field_values[]自定义字段值,如价格的值:9.9

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"article_id": 14
}
}

文章编辑

参数是否必填描述
id必填文章ID
title必填文章标题
content文章内容
excerpt文章摘要
cover文章封面
author_uid作者的用户ID,可在后台用户管理页面查看
sort_id文章分类ID,可在后台分类管理页面查看
tags文章标签,多个半角逗号分隔,如:PHP,MySQL
draft是否发布为草稿,是y, 否n (默认为n)
post_date发布时间,如:2022-05-03 23:30:16

返回结果

{
"code": 0,
"msg": "ok",
"data": ""
}

文章列表

参数是否必填描述
page第几页,默认从1开始
count每页文章数量,默认跟随后台设置
sort_id文章分类ID,可在后台分类管理页面查看
keyword搜索关键词,仅匹配文章标题
tag文章标签
order文章排序,默认按照时间倒序排序,views:按照浏览量倒序排序,comnum:按照评论数倒序排序

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"articles": [
{
"id": 31908,
"title": "这里是文章标题",
"cover": "",
"url": "https://www.emlog.dev/post/31908",
"description": "这里是文章的摘要内容",
"date": "2021-10-11 08:04:11",
"author_id": 3,
"author_name": "张三",
"sort_id": 53,
"sort_name": "分类名称",
"views": 1,
"comnum": 0,
"like_count": 1,
"top": "y",
"sortop": "n",
"tags": [
{
"name": "emlog",
"url": "http://localhost:8080/?tag=emlog"
}
],
"need_pwd": "y",
"fields": {
"price": "9.9",
"color": "#ffffff"
}
}
]
}
}

文章详情

参数是否必填描述
id文章ID
password文章密码,用于访问设置了密码的文章

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"article": {
"title": "文章的标题",
"date": "2022-06-04 10:42:12",
"id": 54215,
"sort_id": -1,
"sort_name": "",
"type": "blog",
"author_id": "1",
"author_name": "snowsun",
"author_avatar": "http://localhost/content/uploadfile/202408/ad7b1723864764.jpg",
"content": "<p>文章的内容</p>",
"excerpt": "<p>这里是文章的摘要</p>",
"cover": "文章封面",
"views": 2,
"comnum": 0,
"like_count": 1,
"top": "n",
"sortop": "n",
"tags": [
{
"name": "emlog",
"url": "http://localhost/?tag=emlog"
}
],
"fields": {
"price": "9.9",
"color": "#ffffff",
}
}
}
}

文章字段说明

参数描述
id文章ID
title文章标题
cover文章封面图
url文章URL
description文章摘要
date发布日期
author_id作者ID
author_name作者昵称
author_avatar作者头像
sort_id分类ID
sort_name分类名称
views阅读数
comnum评论数
like_count点赞数
top首页置顶 y是 n否
sortop分类置顶 y是 n否
tags标签
need_pwd是否设置密码 y是 n否
fields自定义字段

分类列表

  • 获取全部分类列表(包括子分类栏目)接口
  • 接口URL:https://yourdomain/?rest-api=sort_list
  • 请求方式:GET
  • 接口鉴权方式:无需鉴权
  • 返回格式:JSON
  • 请求参数:无

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"sorts": [
{
"lognum": "0",
"sortname": "体育栏目",
"description": "",
"alias": "sport",
"sid": 1,
"taxis": 0,
"pid": 0,
"template": "",
"children": [
{
"lognum": "0",
"sortname": "足球",
"description": "",
"alias": "football",
"sid": 2,
"taxis": 0,
"pid": 1,
"template": ""
}
]
}
]
}
}

微语笔记发布

  • 微语笔记发布接口
  • 接口URL:https://yourdomain/?rest-api=note_post
  • 请求方式:POST
  • 接口鉴权方式:【API秘钥鉴权】 或者 【cookie鉴权】
  • 返回格式:JSON
  • 请求参数:
参数是否必填描述
t必填微语笔记内容
private是否私密,y私密,n公开,默认公开
author_uid作者的用户ID,可在后台用户管理页面查看

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"note_id": 4
}
}

微语笔记列表

  • 获取微语笔记的列表接口
  • 接口URL:https://yourdomain/?rest-api=note_list
  • 请求方式:GET
  • 接口鉴权方式:【API秘钥鉴权】 或者 【cookie鉴权】
  • 返回格式:JSON
  • 请求参数:
参数是否必填描述
page第几页,默认从1开始
count每页文章数量,默认跟随后台设置
author_uid作者的用户ID,可在后台用户管理页面查看

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"notes": [
{
"t": "<h1>test note</h1>",
"t_raw": "# test note",
"date": "47 秒前",
"author_id": 1,
"author_name": "emer"
},
...
,
]
}
}

资源文件上传

  • 上传图片、zip包等资源文件
  • 接口URL:https://yourdomain/?rest-api=upload
  • 请求方式:POST
  • 接口鉴权方式:【API秘钥鉴权】
  • 返回格式:JSON
  • 请求参数:
参数是否必填描述
file必填文件,要上传的媒体文件(二进制文件)
author_uid作者的用户ID,可在后台用户管理页面查看
sid资源分类ID

返回结果

{
"code": 0,
"msg": "ok",
"data": {
"media_id": 80,
"url": "http://yourdomain/content/uploadfile/202307/7e6f1690266418.png",
"file_info": {
"file_name": "icon-1024.png",
"mime_type": "image/png",
"size": 258642,
"width": 1024,
"height": 1024,
"file_path": "../content/uploadfile/202307/7e6f1690266418.png",
"thum_file": "../content/uploadfile/202307/thum-7e6f1690266418.png"
}
}
}

常见错误信息

  • 报错返回格式:json
错误信息描述http状态码
sign error签名错误401
api is closed未开启API,请在后台设置开启400
API function is not exist不存在的API方法400
parameter error必填参数缺失400

错误返回示例

{
"code": 1,
"msg": "sign error",
"data": ""
}

调用示例

PHP调用示例

PHP调用示例(发布微语笔记)

<?php

// API秘钥,在后台系统-设置-API接口设置里可以找到
$apikey = 'your_api_key';

// 请求参数
$data = array(
't' => '这是一篇测试微语笔记',
'author_uid' => '1',
'api_key' => $apikey
);

// 请求URL
$url = 'https://yourdomain/?rest-api=note_post';

$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));// 设置请求参数
curl_setopt($ch, CURLOPT_URL, $url);// 设置请求URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// 设置返回结果不直接输出
$response = curl_exec($ch);// 执行请求并获取响应数据
curl_close($ch);// 关闭curl

echo $response; // 输出响应结果

python调用示例

python调用示例(发布微语笔记)

import time
import hashlib
import requests

# API秘钥,在后台系统-设置-API接口设置里可以找到
apikey = 'your_api_key'

# 请求参数
data = {
't': '这是一篇测试微语笔记',
'author_uid': '1',
'api_key': apikey
}

# 请求URL
url = 'https://yourdomain/?rest-api=note_post'
response = requests.post(url, data=data)
print(response.text) # 输出响应结果

js调用示例

js调用示例(发布评论)

// 使用了jquery
// 获取表单数据
const gid = $('#gid').val();
const comname = $('#comname').val();
const comment = $('#comment').val();
const commail = $('#commail').val();
const comurl = $('#comurl').val();
const imgcode = $('#imgcode').val();
const pid = $('#pid').val();
const resp = $('#resp').val();

// 发送 POST 请求
$.post('https://yourdomain/index.php?action=addcom', {
gid: gid,
comname: comname,
comment: comment,
commail: commail,
comurl: comurl,
imgcode: imgcode,
pid: pid,
resp: resp
}).done(function (response) {
if (response.code === 0) {
alert('评论成功!');
// 刷新页面或其他操作
} else {
alert(response.msg);
}
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log('请求失败:' + textStatus);
});

文件上传示例

PHP 实现上传图片示例

<?php

// API秘钥,在后台系统-设置-API接口设置里可以找到
$apikey = 'your_api_key';

// 请求URL
$url = 'https://yourdomain/?rest-api=upload';

// 要上传的文件路径
$file_path = '/path/to/your/file.png';

// 构造POST数据
$post_data = array(
'file' => new CURLFile($file_path),
'sid' => 1, // 资源分类ID,如果不需要可以省略
'api_key' => $apikey
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);// 设置请求URL
curl_setopt($ch, CURLOPT_POST, 1);// 设置为POST请求
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);// 设置POST数据
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// 设置返回结果不直接输出
$response = curl_exec($ch);// 执行请求并获取响应数据

// 检查是否有错误发生
if (curl_errno($ch)) {
echo 'Error: ' . curl_error($ch);
} else {
// 解析JSON格式的响应数据
$json_response = json_decode($response, true);
if ($json_response['code'] === 0) {
echo 'Upload successful! Media ID: ' . $json_response['data']['media_id'];
echo 'File URL: ' . $json_response['data']['url'];
} else {
echo 'Upload failed: ' . $json_response['msg'];
}
}

curl_close($ch);// 关闭curl