💬 增加贡献指南
This commit is contained in:
73
CONTRIBUTING.md
Normal file
73
CONTRIBUTING.md
Normal 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. 提交拉取请求后,项目维护者将会审核您的代码,并与您协作以确保贡献的质量和一致性。
|
||||
|
||||
## 感谢您的贡献
|
||||
|
||||
非常感谢您为项目做出的贡献!您的工作对于项目的发展和成功至关重要。项目维护者会尽快审查您的贡献并与您合作,以确保其顺利合并到主项目中。
|
||||
|
||||
如果您有任何问题或需要进一步的帮助,请随时与项目维护者进行沟通。
|
||||
@@ -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)
|
||||
|
||||
@@ -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
45
model/Pixiv/login.js
Normal 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
38
model/Pixiv/utils.js
Normal 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'
|
||||
}
|
||||
Reference in New Issue
Block a user