💬 增加贡献指南

This commit is contained in:
yeyang
2024-03-25 18:13:39 +08:00
committed by 🌌
parent d5aa4dbf91
commit 42a132d6d8
5 changed files with 164 additions and 80 deletions

73
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,73 @@
# 贡献指南
感谢您有兴趣为项目做出贡献!遵循以下准则和步骤,以确保您的贡献符合项目的要求。
## 安装依赖
在开始贡献之前,请确保您的开发环境满足以下要求:
- Node.js推荐使用最新稳定版本
- pnpm
## 克隆项目
使用 Git 克隆项目到本地开发环境:
```sh
git clone https://gitee.com/yeyang52/yenai-plugin
git clone https://github.com/yeyang52/yenai-plugin
```
## 安装依赖
运行以下命令安装项目所需的依赖项:
```sh
pnpm install
```
## 开发过程
在进行开发之前,请遵循以下准则:
- 严格遵守项目的 ESLint 规则,确保代码的质量和一致性。
- 尽量遵循项目的代码风格和命名约定,以保持代码的可读性。
- 提交的代码应该是经过测试的,并且不会破坏现有的功能。
## Git 提交规范
为了确保提交的代码符合项目的要求,我们使用 Husky 和 lint-staged 进行 Git 提交时的规范检测。请按照以下步骤进行提交:
1. 在进行 Git 提交之前,确保您的代码已经通过 ESLint 的检查。
2. 运行以下命令进行 Git 提交:
```sh
git add .
git commit
```
在提交时Husky 会自动运行预定义的 Git 钩子脚本,包括对代码规范的检测。
3. 如果提交的代码不符合项目的规范要求,您将会收到相应的错误提示。请根据提示信息进行修改和调整,直到提交的代码符合要求。
## 提交拉取请求
当您准备好将您的贡献合并到主项目中时,请按照以下步骤提交拉取请求:
1. 将您的本地分支推送到远程仓库:
```sh
git push origin master
```
2. 在项目仓库的页面上,点击 "New Pull Request"(或类似的按钮),创建一个新的拉取请求。
3. 填写拉取请求的相关信息,包括描述您的贡献的详细内容和目的。
4. 提交拉取请求后,项目维护者将会审核您的代码,并与您协作以确保贡献的质量和一致性。
## 感谢您的贡献
非常感谢您为项目做出的贡献!您的工作对于项目的发展和成功至关重要。项目维护者会尽快审查您的贡献并与您合作,以确保其顺利合并到主项目中。
如果您有任何问题或需要进一步的帮助,请随时与项目维护者进行沟通。

View File

@@ -265,6 +265,10 @@ Tip具体可使用 **#椰奶群管帮助** 查看
本段遵循 [all-contributors](https://github.com/all-contributors/all-contributors) 规范,欢迎任何形式的贡献!
## 如何贡献
请查看我们的[贡献指南](CONTRIBUTING.md),了解如何开始贡献
## 友情链接 😊
- [Yunzai-Bot插件索引](https://gitee.com/Hikari666/Yunzai-Bot-plugins-index)

View File

@@ -1,23 +1,12 @@
import request, { qs } from '../../lib/request/request.js'
import moment from 'moment'
import { Config } from '../../components/index.js'
import md5 from 'md5'
import { login, headers } from './login.js'
import { timeToSeconds, getNoonTomorrow } from './utils.js'
const CLIENT_ID = 'MOBrBDS8blbauoSck0ZfDbtuzpyT'
const CLIENT_SECRET = 'lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj'
const HASH_SECRET = '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c'
export default class PixivApi {
constructor (refresh_token) {
this.baseUrl = 'https://app-api.pixiv.net/'
this.headers = {
'User-Agent': 'PixivIOSApp/7.13.3 (iOS 14.6; iPhone13,2)',
'Accept-Language': Config.pixiv.language,
'App-OS': 'ios',
'App-OS-Version': '14.6',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': '*/*',
'Connection': 'Keep-Alive'
}
this.headers = headers
this._once = false
this.refresh_token = refresh_token
this.access_token = null
@@ -28,32 +17,10 @@ export default class PixivApi {
if (!this.refresh_token) {
throw Error('[Yenai][Pixiv] 未配置refresh_token刷新令牌')
}
const local_time = moment().format()
const headers = {
...this.headers,
'X-Client-Time': local_time,
'X-Client-Hash': md5(`${local_time}${HASH_SECRET}`)
}
const data = {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
grant_type: 'refresh_token',
refresh_token: this.refresh_token
}
const { response, error } = await request.post('https://oauth.secure.pixiv.net/auth/token', {
data,
headers
}).then(res => res.json())
if (error) throw Error(`[Yenai][Pixiv]login Error Response: ${error}`)
const response = login(this.refresh_token)
this.access_token = response.access_token
this.refresh_token = response.refresh_token
this.auth = response
if (this.access_token) {
const { id, name, account } = this.auth.user
logger.info(`[Yenai][Pixiv]login ${logger.yellow(`${name}(${id}) @${account}`)} ${logger.green('success')}`)
} else {
logger.error(`[Yenai][Pixiv]login ${logger.red('fail')}`)
}
}
async request (target, options = {}, caching = false) {
@@ -201,46 +168,3 @@ export default class PixivApi {
return await this.request('v1/illust/recommended', params)
}
}
/**
*
* @param time
*/
function timeToSeconds (time) {
let seconds = 0
let timeArray = time.split(' ')
for (let i = 0; i < timeArray.length; i++) {
let unit = timeArray[i].charAt(timeArray[i].length - 1)
let value = parseInt(timeArray[i].substring(0, timeArray[i].length - 1))
switch (unit) {
case 's':
seconds += value
break
case 'm':
seconds += value * 60
break
case 'h':
seconds += value * 60 * 60
break
case 'd':
seconds += value * 60 * 60 * 24
break
default:
break
}
}
return seconds
}
/**
*
*/
function getNoonTomorrow () {
const now = moment() // 获取当前时间
const noonToday = moment().startOf('day').add(12, 'hours') // 获取今天中午12点的时间
const noonTomorrow = moment().add(1, 'day').startOf('day').add(12, 'hours') // 获取明天中午12点的时间
let time = now < noonToday
? noonToday.diff(now, 'hours')
: noonTomorrow.diff(now, 'hours')
if (time > 12) time = 12
return time + 'h'
}

45
model/Pixiv/login.js Normal file
View File

@@ -0,0 +1,45 @@
import { Config } from '../../components/index.js'
import moment from 'moment'
import request from '../../lib/request/request.js'
import md5 from 'md5'
const CLIENT_ID = 'MOBrBDS8blbauoSck0ZfDbtuzpyT'
const CLIENT_SECRET = 'lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj'
const HASH_SECRET = '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c'
export const headers = {
'User-Agent': 'PixivIOSApp/7.13.3 (iOS 14.6; iPhone13,2)',
'Accept-Language': Config.pixiv.language,
'App-OS': 'ios',
'App-OS-Version': '14.6',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': '*/*',
'Connection': 'Keep-Alive'
}
export async function login (refresh_token) {
const local_time = moment().format()
const headers = {
...this.headers,
'X-Client-Time': local_time,
'X-Client-Hash': md5(`${local_time}${HASH_SECRET}`)
}
const data = {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
grant_type: 'refresh_token',
refresh_token
}
const { response, error } = await request.post('https://oauth.secure.pixiv.net/auth/token', {
data,
headers
}).then(res => res.json())
if (error) throw Error(`[Yenai][Pixiv]login Error Response: ${error}`)
if (response.access_token) {
const { id, name, account } = this.auth.user
logger.info(`[Yenai][Pixiv]login ${logger.yellow(`${name}(${id}) @${account}`)} ${logger.green('success')}`)
} else {
logger.error(`[Yenai][Pixiv]login ${logger.red('fail')}`)
}
return response
}

38
model/Pixiv/utils.js Normal file
View File

@@ -0,0 +1,38 @@
import moment from 'moment'
export function timeToSeconds (time) {
let seconds = 0
let timeArray = time.split(' ')
for (let i = 0; i < timeArray.length; i++) {
let unit = timeArray[i].charAt(timeArray[i].length - 1)
let value = parseInt(timeArray[i].substring(0, timeArray[i].length - 1))
switch (unit) {
case 's':
seconds += value
break
case 'm':
seconds += value * 60
break
case 'h':
seconds += value * 60 * 60
break
case 'd':
seconds += value * 60 * 60 * 24
break
default:
break
}
}
return seconds
}
export function getNoonTomorrow () {
const now = moment() // 获取当前时间
const noonToday = moment().startOf('day').add(12, 'hours') // 获取今天中午12点的时间
const noonTomorrow = moment().add(1, 'day').startOf('day').add(12, 'hours') // 获取明天中午12点的时间
let time = now < noonToday
? noonToday.diff(now, 'hours')
: noonTomorrow.diff(now, 'hours')
if (time > 12) time = 12
return time + 'h'
}