mirror of
https://github.com/okxlin/appstore.git
synced 2025-07-13 21:02:18 +08:00
feat:添加nitter到列表#457
This commit is contained in:
parent
42f1a36678
commit
1628f2c39a
20
apps/nitter/README.md
Normal file
20
apps/nitter/README.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Nitter
|
||||||
|
|
||||||
|
[](https://github.com/zedeus/nitter/actions/workflows/run-tests.yml)
|
||||||
|
[](https://github.com/zedeus/nitter/actions/workflows/build-docker.yml)
|
||||||
|
[](#license)
|
||||||
|
|
||||||
|
A free and open source alternative Twitter front-end focused on privacy and
|
||||||
|
performance. \
|
||||||
|
Inspired by the [Invidious](https://github.com/iv-org/invidious)
|
||||||
|
project.
|
||||||
|
|
||||||
|
- No JavaScript or ads
|
||||||
|
- All requests go through the backend, client never talks to Twitter
|
||||||
|
- Prevents Twitter from tracking your IP or JavaScript fingerprint
|
||||||
|
- Uses Twitter's unofficial API (no rate limits or developer account required)
|
||||||
|
- Lightweight (for [@nim_lang](https://nitter.net/nim_lang), 60KB vs 784KB from twitter.com)
|
||||||
|
- RSS feeds
|
||||||
|
- Themes
|
||||||
|
- Mobile support (responsive design)
|
||||||
|
- AGPLv3 licensed, no proprietary instances permitted
|
19
apps/nitter/data.yml
Normal file
19
apps/nitter/data.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
name: Nitter
|
||||||
|
tags:
|
||||||
|
- 实用工具
|
||||||
|
title: 匿名浏览 Twitter
|
||||||
|
description: 匿名浏览 Twitter 的开源工具
|
||||||
|
additionalProperties:
|
||||||
|
key: nitter
|
||||||
|
name: Nitter
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 匿名浏览 Twitter 的开源工具
|
||||||
|
shortDescEn: Alternative Twitter front-end
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://nitter.net
|
||||||
|
github: https://github.com/zedeus/nitter
|
||||||
|
document: https://github.com/zedeus/nitter
|
30
apps/nitter/latest/.env.sample
Normal file
30
apps/nitter/latest/.env.sample
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
ADDRESS="0.0.0.0"
|
||||||
|
BASE64_MEDIA="false"
|
||||||
|
CONTAINER_NAME="nitter"
|
||||||
|
DATA_PATH="./data"
|
||||||
|
ENABLE_DEBUG="false"
|
||||||
|
ENABLE_RSS="true"
|
||||||
|
HLS_PLAYBACK="false"
|
||||||
|
HMAC_KEY="C7PPBcaNCL5B5Zkt6uHU"
|
||||||
|
HOSTNAME="nitter.net"
|
||||||
|
HTTPS="false"
|
||||||
|
HTTP_MAX_CONNECTIONS="100"
|
||||||
|
INFINITE_SCROLL="false"
|
||||||
|
LIST_MINUTES="240"
|
||||||
|
PANEL_APP_PORT_HTTP="40238"
|
||||||
|
PANEL_REDIS_ROOT_PASSWORD="E5TRJPM0U43WN8Ac7G7ks1cFzYgLyH"
|
||||||
|
PROXY=""
|
||||||
|
PROXY_AUTH=""
|
||||||
|
PROXY_VIDEOS="true"
|
||||||
|
REDIS_CONNECTIONS="20"
|
||||||
|
REDIS_HOST="redis"
|
||||||
|
REDIS_MAX_CONNECTIONS="30"
|
||||||
|
REDIS_PORT="6379"
|
||||||
|
REPLACE_REDDIT="teddit.net"
|
||||||
|
REPLACE_TWITTER="nitter.net"
|
||||||
|
REPLACE_YOUTUBE="piped.video"
|
||||||
|
RSS_MINUTES="10"
|
||||||
|
STATIC_DIR="./public"
|
||||||
|
THEME="Nitter"
|
||||||
|
TITLE="nitter"
|
||||||
|
TOKEN_COUNT="10"
|
238
apps/nitter/latest/data.yml
Normal file
238
apps/nitter/latest/data.yml
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: "nitter.net"
|
||||||
|
edit: true
|
||||||
|
envKey: HOSTNAME
|
||||||
|
labelEn: Hostname
|
||||||
|
labelZh: 主机名
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "nitter"
|
||||||
|
edit: true
|
||||||
|
envKey: TITLE
|
||||||
|
labelEn: Title
|
||||||
|
labelZh: 标题
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "0.0.0.0"
|
||||||
|
edit: true
|
||||||
|
envKey: ADDRESS
|
||||||
|
labelEn: Listening Address (in container)
|
||||||
|
labelZh: 监听地址 (容器内)
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "40238"
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: HTTP Port
|
||||||
|
labelZh: HTTP 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: ./data
|
||||||
|
disabled: true
|
||||||
|
envKey: DATA_PATH
|
||||||
|
labelEn: Data folder path
|
||||||
|
labelZh: 数据文件夹路径
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "false"
|
||||||
|
edit: true
|
||||||
|
envKey: HTTPS
|
||||||
|
labelEn: HTTPS Enabled
|
||||||
|
labelZh: 启用 HTTPS
|
||||||
|
required: true
|
||||||
|
type: select
|
||||||
|
values:
|
||||||
|
- label: "True"
|
||||||
|
value: "true"
|
||||||
|
- label: "False"
|
||||||
|
value: "false"
|
||||||
|
- default: "100"
|
||||||
|
edit: true
|
||||||
|
envKey: HTTP_MAX_CONNECTIONS
|
||||||
|
labelEn: Max HTTP Connections
|
||||||
|
labelZh: 最大 HTTP 连接数
|
||||||
|
required: true
|
||||||
|
type: number
|
||||||
|
- default: "./public"
|
||||||
|
edit: true
|
||||||
|
envKey: STATIC_DIR
|
||||||
|
labelEn: Static Directory
|
||||||
|
labelZh: 静态文件目录
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "240"
|
||||||
|
edit: true
|
||||||
|
envKey: LIST_MINUTES
|
||||||
|
labelEn: List Cache Minutes
|
||||||
|
labelZh: 列表缓存分钟数
|
||||||
|
required: true
|
||||||
|
type: number
|
||||||
|
- default: "10"
|
||||||
|
edit: true
|
||||||
|
envKey: RSS_MINUTES
|
||||||
|
labelEn: RSS Cache Minutes
|
||||||
|
labelZh: RSS 缓存分钟数
|
||||||
|
required: true
|
||||||
|
type: number
|
||||||
|
- default: ""
|
||||||
|
edit: true
|
||||||
|
envKey: REDIS_HOST
|
||||||
|
key: redis
|
||||||
|
labelEn: Redis Service
|
||||||
|
labelZh: Redis服务
|
||||||
|
required: true
|
||||||
|
type: service
|
||||||
|
- default: "6379"
|
||||||
|
edit: true
|
||||||
|
envKey: REDIS_PORT
|
||||||
|
labelEn: Redis Service Port
|
||||||
|
labelZh: Redis服务端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: ""
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_REDIS_ROOT_PASSWORD
|
||||||
|
labelEn: Redis Password
|
||||||
|
labelZh: Redis 密码
|
||||||
|
required: true
|
||||||
|
type: password
|
||||||
|
- default: "20"
|
||||||
|
edit: true
|
||||||
|
envKey: REDIS_CONNECTIONS
|
||||||
|
labelEn: Redis Connections
|
||||||
|
labelZh: Redis 连接数
|
||||||
|
required: true
|
||||||
|
type: number
|
||||||
|
- default: "30"
|
||||||
|
edit: true
|
||||||
|
envKey: REDIS_MAX_CONNECTIONS
|
||||||
|
labelEn: Redis Max Connections
|
||||||
|
labelZh: Redis 最大连接数
|
||||||
|
required: true
|
||||||
|
type: number
|
||||||
|
- default: "C7PPBcaNCL5B5Zkt6uHU"
|
||||||
|
edit: true
|
||||||
|
envKey: HMAC_KEY
|
||||||
|
labelEn: Random key for cryptographic signing of video urls
|
||||||
|
labelZh: 用于视频网址加密签名的随机密钥
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "false"
|
||||||
|
edit: true
|
||||||
|
envKey: BASE64_MEDIA
|
||||||
|
labelEn: Base64 Media
|
||||||
|
labelZh: Base64 媒体
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "true"
|
||||||
|
edit: true
|
||||||
|
envKey: ENABLE_RSS
|
||||||
|
labelEn: Enable RSS
|
||||||
|
labelZh: 启用 RSS
|
||||||
|
required: true
|
||||||
|
type: select
|
||||||
|
values:
|
||||||
|
- label: "True"
|
||||||
|
value: "true"
|
||||||
|
- label: "False"
|
||||||
|
value: "false"
|
||||||
|
- default: "false"
|
||||||
|
edit: true
|
||||||
|
envKey: ENABLE_DEBUG
|
||||||
|
labelEn: Enable Debug
|
||||||
|
labelZh: 启用调试
|
||||||
|
required: true
|
||||||
|
type: select
|
||||||
|
values:
|
||||||
|
- label: "True"
|
||||||
|
value: "true"
|
||||||
|
- label: "False"
|
||||||
|
value: "false"
|
||||||
|
- default: ""
|
||||||
|
edit: true
|
||||||
|
envKey: PROXY
|
||||||
|
labelEn: Proxy
|
||||||
|
labelZh: 代理
|
||||||
|
required: false
|
||||||
|
type: text
|
||||||
|
- default: ""
|
||||||
|
edit: true
|
||||||
|
envKey: PROXY_AUTH
|
||||||
|
labelEn: Proxy Auth
|
||||||
|
labelZh: 代理认证
|
||||||
|
required: false
|
||||||
|
type: text
|
||||||
|
- default: "10"
|
||||||
|
edit: true
|
||||||
|
envKey: TOKEN_COUNT
|
||||||
|
labelEn: Token Count
|
||||||
|
labelZh: Token 数量
|
||||||
|
required: true
|
||||||
|
type: number
|
||||||
|
- default: "Nitter"
|
||||||
|
edit: true
|
||||||
|
envKey: THEME
|
||||||
|
labelEn: Theme
|
||||||
|
labelZh: 主题
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "nitter.net"
|
||||||
|
edit: true
|
||||||
|
envKey: REPLACE_TWITTER
|
||||||
|
labelEn: Replace Twitter
|
||||||
|
labelZh: 替换 Twitter
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "piped.video"
|
||||||
|
edit: true
|
||||||
|
envKey: REPLACE_YOUTUBE
|
||||||
|
labelEn: Replace YouTube
|
||||||
|
labelZh: 替换 YouTube
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "teddit.net"
|
||||||
|
edit: true
|
||||||
|
envKey: REPLACE_REDDIT
|
||||||
|
labelEn: Replace Reddit
|
||||||
|
labelZh: 替换 Reddit
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: "true"
|
||||||
|
edit: true
|
||||||
|
envKey: PROXY_VIDEOS
|
||||||
|
labelEn: Proxy Videos
|
||||||
|
labelZh: 代理视频
|
||||||
|
required: true
|
||||||
|
type: select
|
||||||
|
values:
|
||||||
|
- label: "True"
|
||||||
|
value: "true"
|
||||||
|
- label: "False"
|
||||||
|
value: "false"
|
||||||
|
- default: "false"
|
||||||
|
edit: true
|
||||||
|
envKey: HLS_PLAYBACK
|
||||||
|
labelEn: HLS Playback
|
||||||
|
labelZh: HLS 播放
|
||||||
|
required: true
|
||||||
|
type: select
|
||||||
|
values:
|
||||||
|
- label: "True"
|
||||||
|
value: "true"
|
||||||
|
- label: "False"
|
||||||
|
value: "false"
|
||||||
|
- default: "false"
|
||||||
|
edit: true
|
||||||
|
envKey: INFINITE_SCROLL
|
||||||
|
labelEn: Infinite Scroll
|
||||||
|
labelZh: 无限滚动
|
||||||
|
required: true
|
||||||
|
type: select
|
||||||
|
values:
|
||||||
|
- label: "True"
|
||||||
|
value: "true"
|
||||||
|
- label: "False"
|
||||||
|
value: "false"
|
44
apps/nitter/latest/data/nitter.conf
Normal file
44
apps/nitter/latest/data/nitter.conf
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
[Server]
|
||||||
|
hostname = "nitter.net" # for generating links, change this to your own domain/ip
|
||||||
|
title = "nitter"
|
||||||
|
address = "0.0.0.0"
|
||||||
|
port = 8080
|
||||||
|
https = false # disable to enable cookies when not using https
|
||||||
|
httpMaxConnections = 100
|
||||||
|
staticDir = "./public"
|
||||||
|
|
||||||
|
[Cache]
|
||||||
|
listMinutes = 240 # how long to cache list info (not the tweets, so keep it high)
|
||||||
|
rssMinutes = 10 # how long to cache rss queries
|
||||||
|
redisHost = "localhost" # Change to "nitter-redis" if using docker-compose
|
||||||
|
redisPort = 6379
|
||||||
|
redisPassword = ""
|
||||||
|
redisConnections = 20 # minimum open connections in pool
|
||||||
|
redisMaxConnections = 30
|
||||||
|
# new connections are opened when none are available, but if the pool size
|
||||||
|
# goes above this, they're closed when released. don't worry about this unless
|
||||||
|
# you receive tons of requests per second
|
||||||
|
|
||||||
|
[Config]
|
||||||
|
hmacKey = "secretkey" # random key for cryptographic signing of video urls
|
||||||
|
base64Media = false # use base64 encoding for proxied media urls
|
||||||
|
enableRSS = true # set this to false to disable RSS feeds
|
||||||
|
enableDebug = false # enable request logs and debug endpoints (/.tokens)
|
||||||
|
proxy = "" # http/https url, SOCKS proxies are not supported
|
||||||
|
proxyAuth = ""
|
||||||
|
tokenCount = 10
|
||||||
|
# minimum amount of usable tokens. tokens are used to authorize API requests,
|
||||||
|
# but they expire after ~1 hour, and have a limit of 500 requests per endpoint.
|
||||||
|
# the limits reset every 15 minutes, and the pool is filled up so there's
|
||||||
|
# always at least `tokenCount` usable tokens. only increase this if you receive
|
||||||
|
# major bursts all the time and don't have a rate limiting setup via e.g. nginx
|
||||||
|
|
||||||
|
# Change default preferences here, see src/prefs_impl.nim for a complete list
|
||||||
|
[Preferences]
|
||||||
|
theme = "Nitter"
|
||||||
|
replaceTwitter = "nitter.net"
|
||||||
|
replaceYouTube = "piped.video"
|
||||||
|
replaceReddit = "teddit.net"
|
||||||
|
proxyVideos = true
|
||||||
|
hlsPlayback = false
|
||||||
|
infiniteScroll = false
|
29
apps/nitter/latest/docker-compose.yml
Normal file
29
apps/nitter/latest/docker-compose.yml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
nitter:
|
||||||
|
image: zedeus/nitter:latest
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}"
|
||||||
|
volumes:
|
||||||
|
- ${DATA_PATH}/nitter.conf:/src/nitter.conf:Z,ro
|
||||||
|
healthcheck:
|
||||||
|
test: wget -nv --tries=1 --spider http://127.0.0.1:${PANEL_APP_PORT_HTTP}/Jack/status/20 || exit 1
|
||||||
|
interval: 30s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 2
|
||||||
|
user: "998:998"
|
||||||
|
read_only: true
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
32
apps/nitter/latest/scripts/init.sh
Normal file
32
apps/nitter/latest/scripts/init.sh
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source ./.env
|
||||||
|
|
||||||
|
sed -i "s/hostname = \".*\"/hostname = \"${HOSTNAME}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/title = \".*\"/title = \"${TITLE}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/address = \".*\"/address = \"${ADDRESS}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/port = .*/port = ${PANEL_APP_PORT_HTTP}/" ./data/nitter.conf
|
||||||
|
sed -i "s/https = .*/https = ${HTTPS}/" ./data/nitter.conf
|
||||||
|
sed -i "s/httpMaxConnections = .*/httpMaxConnections = ${HTTP_MAX_CONNECTIONS}/" ./data/nitter.conf
|
||||||
|
sed -i "s/staticDir = \".*\"/staticDir = \"${STATIC_DIR}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/listMinutes = .*/listMinutes = ${LIST_MINUTES}/" ./data/nitter.conf
|
||||||
|
sed -i "s/rssMinutes = .*/rssMinutes = ${RSS_MINUTES}/" ./data/nitter.conf
|
||||||
|
sed -i "s/redisHost = \".*\"/redisHost = \"${REDIS_HOST}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/redisPort = .*/redisPort = ${REDIS_PORT}/" ./data/nitter.conf
|
||||||
|
sed -i "s/redisPassword = \".*\"/redisPassword = \"${PANEL_REDIS_ROOT_PASSWORD}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/redisConnections = .*/redisConnections = ${REDIS_CONNECTIONS}/" ./data/nitter.conf
|
||||||
|
sed -i "s/redisMaxConnections = .*/redisMaxConnections = ${REDIS_MAX_CONNECTIONS}/" ./data/nitter.conf
|
||||||
|
sed -i "s/hmacKey = \".*\"/hmacKey = \"${HMAC_KEY}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/base64Media = .*/base64Media = ${BASE64_MEDIA}/" ./data/nitter.conf
|
||||||
|
sed -i "s/enableRSS = .*/enableRSS = ${ENABLE_RSS}/" ./data/nitter.conf
|
||||||
|
sed -i "s/enableDebug = .*/enableDebug = ${ENABLE_DEBUG}/" ./data/nitter.conf
|
||||||
|
sed -i "s/proxy = \".*\"/proxy = \"${PROXY}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/proxyAuth = \".*\"/proxyAuth = \"${PROXY_AUTH}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/tokenCount = .*/tokenCount = ${TOKEN_COUNT}/" ./data/nitter.conf
|
||||||
|
sed -i "s/theme = \".*\"/theme = \"${THEME}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/replaceTwitter = \".*\"/replaceTwitter = \"${REPLACE_TWITTER}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/replaceYouTube = \".*\"/replaceYouTube = \"${REPLACE_YOUTUBE}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/replaceReddit = \".*\"/replaceReddit = \"${REPLACE_REDDIT}\"/" ./data/nitter.conf
|
||||||
|
sed -i "s/proxyVideos = .*/proxyVideos = ${PROXY_VIDEOS}/" ./data/nitter.conf
|
||||||
|
sed -i "s/hlsPlayback = .*/hlsPlayback = ${HLS_PLAYBACK}/" ./data/nitter.conf
|
||||||
|
sed -i "s/infiniteScroll = .*/infiniteScroll = ${INFINITE_SCROLL}/" ./data/nitter.conf
|
BIN
apps/nitter/logo.png
Normal file
BIN
apps/nitter/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Loading…
Reference in New Issue
Block a user