# 手机发布微语/说说


<!--more-->

这几天研究一下长毛象，和 Misskey。发现这开源微博是一个很适合发碎碎念的东西。而且我自己搭的实例就我一个人怎么发也无所谓。在另外的账号，另外的社区内潜水。事实证明，人与人的悲欢并不相同。

​研究active hub过程中，发现了一个go写的。据说能和长毛象互联。而且很适合替代微语js。正好与js所用的云服务国际版不对国内提供服务了。顺手换掉。

​记下使用的相关代码和部署过程。​看了一下misskey和gotosociety的api。

成果: [https://www.ftls.xyz/whispers/](https://www.ftls.xyz/whispers/)

## 相关资料

### Misskey

有PWA，可安装到手机电脑。像普通软件一样。

[https://github.com/misskey-dev/misskey/](https://github.com/misskey-dev/misskey/)
[Fediverse不止Mastodon——Misskey介绍](https://akaito.xyz/post/misskey/#top)
~~[Docker 搭建去中心化的微博客平台 Misskey](https://www.zatp.com/post/build-misskey-docker/)~~

Misskey 部署好之后，打开 https://example.com/api-doc 可打开内置API文档，https://example.com/ 主页登录后侧边栏也有api调试工具。Misskey的缺点就是Docker镜像就2G。如果仅仅一个人使用，作为微语，有点浪费。同时有分支版本 Firefish 可以选择。

**API**:

POST
https://fimb.ftls.xyz/api/users/notes
body:

body json
```json
{
    "userId": "93ckt7gzby",
    "untilDate": 2659324635043, // 13位时间戳
    "limit": 5
}
```

return
说明: 无需认证。请求最新的5条，数据依据时间逆序输出。只会显示public.

内容字段 data[0].text

时间字段 data[0].createdAt

```json
[
    {
        "id": "93dhfnfgl8",
        "createdAt": "2022-07-31T22:52:47.836Z",
        "userId": "93ckt7gzby",
        "user": {
            "id": "93ckt7gzby",
            "name": "恐咖兵糖",
            "username": "kkbt",
            "host": null,
            "avatarUrl": "https://fimb.ftls.xyz/files/thumbnail-a5dd743f-b55c-4c6e-8e9e-d734a3bdd40d",
            "avatarBlurhash": "yHG9OA0000?Fjqx]%M~VfA4ntk%LRQs;4Toz%ftRRPerWp9xt6-UV]oNNabHg3afsWR%S0t6Vs-DRikqRjRjxaofI.s:xaRlRQtRX8",
            "avatarColor": null,
            "isAdmin": true,
            "isCat": true,
            "emojis": [],
            "onlineStatus": "unknown",
            "driveCapacityOverrideMb": null
        },
        "text": "今天早上下大雨，本来据说最高温度32度。看起来下完雨之后能好过一些😃",
        "cw": null,
        "visibility": "public",
        "renoteCount": 0,
        "repliesCount": 0,
        "reactions": {},
        "emojis": [],
        "fileIds": [],
        "files": [],
        "replyId": null,
        "renoteId": null
    },
    .
    .
    .
]
```
随手写了个样例页面，引入了两个常用依赖，不要学。
**HTML example**

```html
<!DOCTYPE html>
<html>

<head>
    <title>我的第一个 HTML 页面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>

<body onload="load();">
    <div id="app">
        <li v-for="it in items" :key="it.text">
            {{ it.text }}
          </li>
    </div>
</body>
<script type="text/javascript">

    function load() {
        console.log("Loading...");
        const url = "https://fimb.ftls.xyz/api/users/notes"
        const dt = {
            "userId": "93ckt7gzby",
            "untilDate": 1659324635043,
            "limit": 5
        }
        const request = axios.post(url, JSON.stringify(dt)).then(function (response) {
            var app = new Vue({
                el: '#app',
                data: {
                    items: response.data
                }
            })
        }).catch(function (error) {
            console.log(error);
        });
    }
</script>
</html>
```

### gotosocial

开源长毛象同类软件。可使用Tusky长毛象客户端，也就是说可以在手机上使用客户端发微语，说说。Docker镜像60M+。基本只有API，可使用，很轻量。建议客户端 Elk 鹿鸣。

#### 资料

开源地址 https://github.com/superseriousbusiness/gotosocial
文档 https://docs.gotosocial.org/en/latest/
API文档 https://docs.gotosocial.org/en/latest/api/swagger/

部署起来不算很麻烦，20230916 算是简单。比 misskey 资源占用少很多。

根据文档部署完成后 创建用户并提升权限。

```bash
docker exec -it gotosocial /gotosocial/gotosocial admin account create --username kkbt --email youremail@gmail.com --password 'YOUR_PASSWORD'
docker exec -it gotosocial /gotosocial/gotosocial admin account confirm --username kkbt
```

这之后，运行 gotosocial 服务，进入 /admin 或 /settings 路径，可以进行简单的管理。

#### 反向代理

这个 GotoSocial 注册完之后，反向代理几个用到的路径就可以了。不反向代理也行，即使用类似 https://fmb.ftls.xyz ，也就是 @kkbt@fmb.ftls.xyz 而不是 @kkbt@ftls.xyz 这样的格式。虽然不太好看，但是各种问题少很多，也不用反向代理了。(此处 fmb 代表 联邦宇宙微博客，虽然在一段时间联邦后，我就没有继续让它联邦)

需要注意的是，这个决定应该在第一次运行之前就做好，并且在配置中正确的声明。在创建账户之后，如果想更改是一件非常麻烦的事情。

{{< image src="https://cdn.ftls.xyz/images/2022/06/20220802120034.png" caption="反向代理几个用到的路径，如果需要的话" >}}


#### 客户端

202405 我使用自己编译的 Gotosocial 来支持 markdown 图片，使用 API 发布嘟嘟。使用鹿鸣管理嘟嘟。

https://github.com/elk-zone/elk https://elk.zone/home/ 鹿鸣

![Screenshot_20240526213022](https://cdn.ftls.xyz/images/2024/05/Screenshot_20240526213022.jpg)

#### API


说明: 无需认证。请求最新的5条，数据依据时间逆序输出。只会显示 public .也就是说，在客户端写微语的时候需要特别注明公开。其他参数参考官网的 swagger 文档。
**API**

GET `https://ftls.xyz/api/v1/accounts/{{ USEID }}/statuses?limit=5`

{{ USEID }} 字段，在搭建完成后，随便上传一张图片。再在网页中显示出来，图片链接路径中就包含 {{ USEID }} 。或者Docker搭建，映射出的data目录，里面有一个文件夹，文件夹名就是 {{ USEID }}。形如 01MQCWFXER7J0VT0NNYV2XQ6Q2


内容字段 data[0].text
时间字段 data[0].created_at

```json
[
    {
        "id": "01G9BRZ4GBN1Q5Y5KD3APK1F85",
        "created_at": "2022-08-01T04:00:03.083Z",
        "in_reply_to_id": "",
        "in_reply_to_account_id": "",
        "sensitive": false,
        "spoiler_text": "",
        "visibility": "public",
        "language": "en",
        "uri": "https://ftls.xyz/users/kkbt/statuses/01G9BRZ4GBN1Q5Y5KD3APK1F85",
        "url": "https://ftls.xyz/@kkbt/statuses/01G9BRZ4GBN1Q5Y5KD3APK1F85",
        "replies_count": 0,
        "reblogs_count": 0,
        "favourites_count": 0,
        "favourited": false,
        "reblogged": false,
        "muted": false,
        "bookmarked": false,
        "pinned": false,
        "content": "<p>111</p>",
        "reblog": null,
        "application": {
            "name": "Tusky",
            "website": "https://tusky.app"
        },
        "account": {
            "id": "{{ USEID }}",
            "username": "kkbt",
            "acct": "kkbt",
            "display_name": "恐咖兵糖",
            "locked": false,
            "bot": false,
            "created_at": "2022-07-31T13:12:23.000Z",
            "note": "<p>浮生若梦，为欢几何？<br/>个人网站 <a href=\"https://www.ftls.xyz\" rel=\"noopener nofollow noreferrer\" target=\"_blank\">www.ftls.xyz</a></p>",
            "url": "https://ftls.xyz/@kkbt",
            "avatar": "https://ftls.xyz/fileserver/{{ USEID }}/attachment/original/01NSEJRKBGDZ23ECNV838DJPWG.png",
            "avatar_static": "https://ftls.xyz/fileserver/{{ USEID }}/attachment/small/01NSEJRKBGDZ23ECNV838DJPWG.jpeg",
            "header": "https://ftls.xyz/fileserver/{{ USEID }}/attachment/original/01DJP5BYYAV057WS2M1PE3GHP0.png",
            "header_static": "https://ftls.xyz/fileserver/{{ USEID }}/attachment/small/01DJP5BYYAV057WS2M1PE3GHP0.jpeg",
            "followers_count": 0,
            "following_count": 0,
            "statuses_count": 7,
            "last_status_at": "2022-08-01T04:00:03.083Z",
            "emojis": [],
            "fields": []
        },
        "media_attachments": [],
        "mentions": [],
        "tags": [],
        "emojis": [],
        "card": null,
        "poll": null,
        "text": "111"
    }
]
```

html和上面的几乎一致，只要改post为get就可以了。最新实际应用的，最新代码在 https://gitee.com/kkbt/www.ftls.xyz/blob/master/layouts/shortcodes/mastodon4.html
效果 [https://www.ftls.xyz/whispers/](https://www.ftls.xyz/whispers/)

此外，此系列有其他文章供参考。[系列 博客-微语](/series/%E5%8D%9A%E5%AE%A2-%E5%BE%AE%E8%AF%AD/)