Compare commits

..

No commits in common. "main" and "0.1.12" have entirely different histories.
main ... 0.1.12

4 changed files with 191 additions and 661 deletions

View File

@ -1,14 +1,21 @@
# gnuboard5-activitypub # gnuboard5-activitypub
GNUBOARD5-ActivityPub: ActivityPub (Fediverse) implementation for GNUBOARD5 ActivityPub implementation for GNUBOARD 5
* https://sir.kr/g5_plugin/10381 ## References
* https://codeberg.org/fediverse/delightful-activitypub-development * https://www.w3.org/TR/activitypub/
* https://www.w3.org/TR/activitystreams-core/
* https://www.w3.org/TR/activitystreams-vocabulary/
* https://github.com/w3c/activitypub/issues/194
* https://docs.joinmastodon.org/spec/webfinger/
* https://organicdesign.nz/ActivityPub_Code
* https://socialhub.activitypub.rocks/t/posting-to-pleroma-inbox/1184
* https://github.com/broidHQ/integrations/tree/master/broid-schemas#readme
## 사용 전 설정 ## 사용 전 설정
* `apstreams` 게시판 추가 * `apstreams` 게시판 추가
* `apstreams` 사용자 추가 * `apstreams` 사용자 추가
## 지원현황 ## 작업진행
- [x] WebFinger - [x] WebFinger
- [x] User - [x] User
- [x] Inbox - [x] Inbox
@ -16,24 +23,14 @@ GNUBOARD5-ActivityPub: ActivityPub (Fediverse) implementation for GNUBOARD5
- [x] Followers - [x] Followers
- [x] Following - [x] Following
- [x] Liked - [x] Liked
- [ ] ~~Shares~~ (Altered to inbound/outbound) - [x] (Added) Geolocation
- [x] Geolocation - [ ] (Added) File attachment
- [x] File attachment
- [ ] File attachment - Automatically download a remote file to the local server
- [x] Digest/Signature - Outbound
- [ ] ~~Digest/Signature - Inbound~~ (No required)
- [x] w3id.org (e.g. the `publicKey` field of an actor)
- [ ] OAuth 2.0
- [ ] Message Queue Compatible (e.g. Redis, RebbitMQ, Kafka)
## 부가기능 (옵션) ## 부가기능 (옵션)
- [x] 아바타 (gravatar.com)
- [x] 날씨 (openweathermap.org) - [x] 날씨 (openweathermap.org)
- [x] 환율 (koreaexim.go.kr) - [x] 환율 (koreaexim.go.kr)
- [x] 국내 Geolocation (Naver Cloud)
- [x] 국외 Geolocation (IP2Location)
## 전문(메시지) 예시 ## 전문 예시
```json ```json
{ {
@ -111,21 +108,5 @@ GNUBOARD5-ActivityPub: ActivityPub (Fediverse) implementation for GNUBOARD5
} }
``` ```
## References
* https://www.w3.org/TR/activitypub/
* https://www.w3.org/TR/activitystreams-core/
* https://www.w3.org/TR/activitystreams-vocabulary/
* https://github.com/w3c/activitypub/issues/194
* https://docs.joinmastodon.org/spec/webfinger/
* https://organicdesign.nz/ActivityPub_Code
* https://socialhub.activitypub.rocks/t/posting-to-pleroma-inbox/1184
* https://github.com/broidHQ/integrations/tree/master/broid-schemas#readme
* https://github.com/autogestion/pubgate-telegram
* https://docs.joinmastodon.org/spec/security/
* https://chat.openai.com/share/4fda7974-cc0b-439a-b0f2-dc828f8acfef
* https://codeberg.org/mro/activitypub/src/commit/4b1319d5363f4a836f23c784ef780b81bc674013/like.sh#L101
* https://socialhub.activitypub.rocks/t/problems-posting-to-mastodon-inbox/801/10
## 문의 ## 문의
* abuse@catswords.net * gnh1201@gmail.com
* ActivityPub [@gnh1201@catswords.social](https://catswords.social/@gnh1201)

File diff suppressed because it is too large Load Diff

View File

@ -1,112 +0,0 @@
<?php
// GhatGPT-ActivityPub implementation for GNUBOARD 5
// Go Namhyeon <abuse@catswords.net>
// MIT License
// 2023-02-16
if (!defined('_GNUBOARD_') || !defined("ACTIVITYPUB_INSTANCE_ID")) exit; // 개별 페이지 접근 불가
// ChatGPT API 키 발급: https://platform.openai.com/account/api-keys
define("CHATGPT_API_KEY", "YOUR_API_KEY"); // API 키 입력
define("CHATGPT_API_URL", "https://api.openai.com/v1/completions"); // GhatGPT API 주소 입력
define("LINGVA_API_URL", "https://lingva.ml/api/v1"); // Lingva Translate (구글 번역기 프론트엔드) API 주소 입력
function lingva_translate($content, $source = 'ko', $target = 'en') {
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, LINGVA_API_URL . '/' . $source . '/' . $target . '/' . urlencode($content));
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
$response = json_decode(curl_exec($handle), true);
curl_close($handle);
return $response['translation'];
}
function lingva_ko2en($content) {
return lingva_translate($content, 'ko', 'en');
}
function lingva_en2ko($content) {
return lingva_translate($content, 'en', 'ko');
}
function chatgpt_request($content, $mb) {
// "What is the capital of France?"
$prompt = lingva_ko2en(filter_var($content, FILTER_SANITIZE_STRING));
$prompt = filter_var($content, FILTER_SANITIZE_STRING);
$data = array(
"model" => "text-davinci-003",
"prompt" => $prompt,
"max_tokens" => 3000,
"temperature" => 0.5,
);
$data_string = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, CHATGPT_API_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Content-Type: application/json",
"Authorization: Bearer " . CHATGPT_API_KEY,
"Content-Length: " . strlen($data_string))
);
$output = curl_exec($ch);
curl_close($ch);
// print_r($output);
$output_json = json_decode($output, true);
$response = $output_json["choices"][0]["text"];
// echo $response;
return lingva_en2ko($response);
}
function chatgpt_send_conversation($content) {
global $member;
// 로그인 상태인 경우 해당 회원, 아닌 경우 ActivityPub 공통 계정
$mb = isset($member['mb_id']) ? $member : get_member(ACTIVITYPUB_G5_USERNAME);
// 수신자 목록
$to = array();
// 참고: 아래에 기술된 역할은 외부 프로그램이 담당하게 할 수도 있음 (service:chatgpt)
if (!empty(CHATGPT_API_KEY)) {
$response = chatgpt_request($content, $mb);
$to[] = "service:chatgpt";
}
// Activity 발행 (발신: 그누보드5 -> ChatGPT)
activitypub_publish_content(
$content,
activitypub_get_url("user", array("mb_id" => $mb['mb_id'])),
get_member(ACTIVITYPUB_G5_USERNAME),
array(),
$to
);
// Activity 발행 (수신: ChatGPT -> 그누보드5)
activitypub_publish_content(
$response,
"service:chatgpt",
get_member(ACTIVITYPUB_G5_USERNAME),
array(),
array(
activitypub_get_url("user", array("mb_id" => $mb['mb_id']))
)
);
}
function _chatgpt_memo_form_update_after($member_list, $str_nick_list, $redirect_url, $me_memo) {
// 수신자에 'apstreams' 계정이 있는지 확인
if (!in_array(ACTIVITYPUB_G5_USERNAME, $member_list['id'])) return;
// ChatGPT에게 대화 걸기
chatgpt_send_conversation($me_memo);
}
add_event("memo_form_update_after", "_chatgpt_memo_form_update_after", 1, 4);

View File

@ -2,7 +2,7 @@
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// ActivityPub/WebHook implementation for GNUBOARD 5 // ActivityPub/WebHook implementation for GNUBOARD 5
// Go Namhyeon <abuse@catswords.net> // Go Namhyeon <gnh1201@gmail.com>
// MIT License // MIT License
// 2022-07-07 // 2022-07-07
@ -17,8 +17,8 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
if (!defined("ACTIVITYPUB_INSTANCE_ID")) return; if (!defined("ACTIVITYPUB_INSTANCE_ID")) return;
define("NATEON_WEBHOOK_URL", ""); define("NATEON_WEBHOOK_URL", "");
define("DISCORD_WEBHOOK_URL", ""); define("DISCORD_WEBHOOK_URL", "https://discord.com/api/webhooks/994470705125134347/ZQUe-LZYDED6MVFSIJb5A_u0kin2hyI26c_LP5lcFje3DpmeVF1AvLB7ap0wFjNrTmNN");
define("SLACK_WEBHOOK_URL", ""); define("SLACK_WEBHOOK_URL", "https://hooks.slack.com/services/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");
define("SLACK_WEBHOOK_CHANNEL", "#webhook"); define("SLACK_WEBHOOK_CHANNEL", "#webhook");
function nateon_send_webhook($content, $mb) { function nateon_send_webhook($content, $mb) {