Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
twitter_syncer
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Odysseus
twitter_syncer
Commits
1ed3a384
Commit
1ed3a384
authored
Aug 22, 2024
by
Ubuntu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
follower API validate
parent
8d89b8ce
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
203 additions
and
59 deletions
+203
-59
accounts.go
accounts.go
+71
-1
api_db.go
api_db.go
+51
-0
api_service.go
api_service.go
+67
-3
client.go
client.go
+5
-50
idx.go
idx.go
+5
-1
syncer
syncer
+0
-0
task.go
task.go
+4
-4
No files found.
accounts.go
View file @
1ed3a384
package
main
package
main
import
(
import
(
"context"
"encoding/base64"
"encoding/base64"
"fmt"
"fmt"
"log/slog"
"log/slog"
...
@@ -9,6 +10,7 @@ import (
...
@@ -9,6 +10,7 @@ import (
twitter
"github.com/g8rswimmer/go-twitter/v2"
twitter
"github.com/g8rswimmer/go-twitter/v2"
twitterscraper
"github.com/imperatrona/twitter-scraper"
twitterscraper
"github.com/imperatrona/twitter-scraper"
"golang.org/x/time/rate"
)
)
func
GetLoginAccount
()
([]
*
twitterscraper
.
Scraper
,
error
)
{
func
GetLoginAccount
()
([]
*
twitterscraper
.
Scraper
,
error
)
{
...
@@ -95,11 +97,79 @@ var accChan chan ScraperWithTimer = make(chan ScraperWithTimer, 20)
...
@@ -95,11 +97,79 @@ var accChan chan ScraperWithTimer = make(chan ScraperWithTimer, 20)
// func init() {
// func init() {
// }
// }
func
NewFollowerOb
()
*
FollowerRateLimit
{
func
Follower
(
userName
string
,
next
string
)
([]
*
twitter
.
UserObj
,
string
,
*
twitter
.
RateLimit
,
error
)
{
return
&
FollowerRateLimit
{
RateLimit
:
rate
.
NewLimiter
(
rate
.
Every
(
15
*
time
.
Minute
),
40
),
}
}
type
FollowerRateLimit
struct
{
RateLimit
*
rate
.
Limiter
Scraper
*
twitterscraper
.
Scraper
}
func
(
f
*
FollowerRateLimit
)
TryProfileFollowerCount
(
username
string
)
(
int
,
error
)
{
i
:=
0
for
{
if
i
>
10
{
return
0
,
fmt
.
Errorf
(
"can not get the %v follower count"
,
username
)
}
fc
,
err
:=
f
.
ProfileFollowerCount
(
username
)
if
err
!=
nil
{
f
.
Scraper
.
GetGuestToken
()
// twitterscraper.GetGuestToken()
// c.Scraper = twitterscraper.New()
slog
.
Error
(
"ProfileFollowerCount"
,
"err"
,
err
.
Error
())
time
.
Sleep
(
time
.
Second
*
time
.
Duration
(
i
))
continue
}
return
fc
,
nil
}
}
func
(
f
*
FollowerRateLimit
)
ProfileFollowerCount
(
username
string
)
(
int
,
error
)
{
if
f
.
Scraper
==
nil
{
f
.
Scraper
=
twitterscraper
.
New
()
}
//c.Scraper.GetProfile("aon_aonet")
pro
,
err
:=
f
.
Scraper
.
GetProfile
(
username
)
if
err
!=
nil
{
return
0
,
err
}
return
pro
.
FollowersCount
,
nil
}
//= rate.NewLimiter(rate.Every(15*time.Minute), 40)
func
(
f
*
FollowerRateLimit
)
Follower
(
userName
string
,
next
string
)
([]
*
twitter
.
UserObj
,
string
,
*
twitter
.
RateLimit
,
error
)
{
fmt
.
Println
(
"Follower request-------------"
)
fmt
.
Println
(
"Follower request-------------"
)
//FollowerRateLimit.
ctx
:=
context
.
Background
()
err
:=
f
.
RateLimit
.
Wait
(
ctx
)
// This is a blocking call.
//err := c.RetweeterRatelimiter.Wait(ctx) // This is a blocking call.
if
err
!=
nil
{
return
nil
,
""
,
nil
,
err
}
select
{
select
{
case
account
:=
<-
accChan
:
case
account
:=
<-
accChan
:
...
...
api_db.go
View file @
1ed3a384
...
@@ -146,6 +146,45 @@ func CheckTaskExist(userId, taskId, taskType string) (bool, error) {
...
@@ -146,6 +146,45 @@ func CheckTaskExist(userId, taskId, taskType string) (bool, error) {
}
}
func
CheckFollowerTaskAndAccountCount
()
(
bool
,
error
)
{
fc
,
err
:=
FollowerTaskCount
()
if
err
!=
nil
{
return
false
,
err
}
ac
,
err
:=
AvailableAccountCount
()
if
err
!=
nil
{
return
false
,
err
}
return
fc
<
ac
,
nil
}
func
FollowerTaskCount
()
(
int64
,
error
)
{
_
,
count
,
err
:=
client
.
From
(
"tasks"
)
.
Select
(
"*"
,
"exact"
,
false
)
.
Eq
(
"stop"
,
"false"
)
.
Execute
()
if
err
!=
nil
{
return
0
,
err
}
return
count
,
nil
}
func
AvailableAccountCount
()
(
int64
,
error
)
{
_
,
count
,
err
:=
client
.
From
(
"accounts"
)
.
Select
(
"*"
,
"exact"
,
false
)
.
Eq
(
"available"
,
"false"
)
.
Execute
()
if
err
!=
nil
{
return
0
,
err
}
return
count
,
nil
}
func
QueryProjectByUserId
(
userId
string
)
([]
ProjectInDb
,
bool
,
error
)
{
func
QueryProjectByUserId
(
userId
string
)
([]
ProjectInDb
,
bool
,
error
)
{
data
,
count
,
err
:=
client
.
From
(
"project"
)
.
Select
(
"*"
,
"exact"
,
false
)
.
Eq
(
"user_id"
,
userId
)
.
Execute
()
data
,
count
,
err
:=
client
.
From
(
"project"
)
.
Select
(
"*"
,
"exact"
,
false
)
.
Eq
(
"user_id"
,
userId
)
.
Execute
()
...
@@ -164,6 +203,18 @@ func QueryProjectByUserId(userId string) ([]ProjectInDb, bool, error) {
...
@@ -164,6 +203,18 @@ func QueryProjectByUserId(userId string) ([]ProjectInDb, bool, error) {
}
}
func
QueryProjectByUserIdAndName
(
userName
,
userId
string
)
(
bool
,
error
)
{
_
,
count
,
err
:=
client
.
From
(
"project"
)
.
Select
(
"*"
,
"exact"
,
false
)
.
Eq
(
"user_id"
,
userId
)
.
Eq
(
"username"
,
userName
)
.
Execute
()
if
err
!=
nil
{
return
false
,
err
}
return
count
>=
1
,
nil
}
func
QueryAvailableProject
()
([]
ProjectInDb
,
error
)
{
func
QueryAvailableProject
()
([]
ProjectInDb
,
error
)
{
data
,
count
,
err
:=
client
.
From
(
"project"
)
.
Select
(
"*"
,
"exact"
,
false
)
.
Eq
(
"available"
,
"true"
)
.
Execute
()
data
,
count
,
err
:=
client
.
From
(
"project"
)
.
Select
(
"*"
,
"exact"
,
false
)
.
Eq
(
"available"
,
"true"
)
.
Execute
()
...
...
api_service.go
View file @
1ed3a384
...
@@ -205,15 +205,60 @@ func TaskAdd(c *fiber.Ctx) error {
...
@@ -205,15 +205,60 @@ func TaskAdd(c *fiber.Ctx) error {
if
req
.
TaskType
==
FollowType
{
if
req
.
TaskType
==
FollowType
{
var
err
error
ok
,
err
:=
CheckFollowerTaskAndAccountCount
()
fc
,
err
=
NewFollowClient
()
.
TryProfileFollowerCount
(
req
.
TaskId
)
if
err
!=
nil
{
if
err
!=
nil
{
return
c
.
JSON
(
Res
{
return
c
.
JSON
(
Res
{
Code
:
500
,
Code
:
500
,
Msg
:
"
NewFollowClient().TryProfileFollowerCount "
+
req
.
TaskId
,
Msg
:
"
CheckFollowerTaskAndAccountCount "
+
req
.
User
,
})
})
}
}
if
!
ok
{
return
c
.
JSON
(
Res
{
Code
:
500
,
Msg
:
"CheckFollowerTaskAndAccountCount !ok"
,
})
}
ok
,
err
=
QueryProjectByUserIdAndName
(
req
.
TaskId
,
req
.
User
)
if
err
!=
nil
{
return
c
.
JSON
(
Res
{
Code
:
500
,
Msg
:
"QueryProjectByUserIdAndName "
+
req
.
User
,
})
}
if
!
ok
{
return
c
.
JSON
(
Res
{
Code
:
500
,
Msg
:
"QueryProjectByUserIdAndName !ok"
,
})
}
//NewFollowerOb()
//var err error
//fc, err = NewFollowClient().TryProfileFollowerCount(req.TaskId)
fc
,
err
=
NewFollowerOb
()
.
TryProfileFollowerCount
(
req
.
TaskId
)
if
err
!=
nil
{
return
c
.
JSON
(
Res
{
Code
:
500
,
Msg
:
"QCheckTask "
+
req
.
User
,
})
}
if
ok
{
return
c
.
JSON
(
Res
{
Code
:
500
,
Msg
:
"task already existed"
,
})
}
}
}
job
:=
TaskJob
{
job
:=
TaskJob
{
...
@@ -260,6 +305,25 @@ func TaskAdd(c *fiber.Ctx) error {
...
@@ -260,6 +305,25 @@ func TaskAdd(c *fiber.Ctx) error {
})
})
}
}
// func CheckErrOk(ok bool, err error, c *fiber.Ctx) error {
// if err != nil {
// return c.JSON(Res{
// Code: 500,
// Msg: "QCheckTask " + req.User,
// })
// }
// if ok {
// return c.JSON(Res{
// Code: 500,
// Msg: "task already existed",
// })
// }
// }
func
TaskStop
(
c
*
fiber
.
Ctx
)
error
{
func
TaskStop
(
c
*
fiber
.
Ctx
)
error
{
slog
.
Info
(
c
.
Route
()
.
Path
,
"body"
,
string
(
c
.
Request
()
.
Body
()))
slog
.
Info
(
c
.
Route
()
.
Path
,
"body"
,
string
(
c
.
Request
()
.
Body
()))
...
...
client.go
View file @
1ed3a384
...
@@ -3,7 +3,6 @@ package main
...
@@ -3,7 +3,6 @@ package main
import
(
import
(
"context"
"context"
"fmt"
"fmt"
"log/slog"
"net/http"
"net/http"
"time"
"time"
...
@@ -69,11 +68,11 @@ type Config struct {
...
@@ -69,11 +68,11 @@ type Config struct {
Token
string
`json:"token"`
Token
string
`json:"token"`
}
}
func
NewFollowClient
()
*
Client
{
//
func NewFollowClient() *Client {
return
&
Client
{
//
return &Client{
Scraper
:
twitterscraper
.
New
(),
//
Scraper: twitterscraper.New(),
}
//
}
}
//
}
func
NewLikeClient
(
cfg
Config
)
*
Client
{
func
NewLikeClient
(
cfg
Config
)
*
Client
{
return
NewClient
(
cfg
,
LikeRateLimit
)
return
NewClient
(
cfg
,
LikeRateLimit
)
...
@@ -145,50 +144,6 @@ func NewOAuth2Client0817() *Client {
...
@@ -145,50 +144,6 @@ func NewOAuth2Client0817() *Client {
Client
:
twitterClient
,
Client
:
twitterClient
,
}
}
}
}
func
(
c
*
Client
)
TryProfileFollowerCount
(
username
string
)
(
int
,
error
)
{
i
:=
0
for
{
if
i
>
10
{
return
0
,
fmt
.
Errorf
(
"can not get the %v follower count"
,
username
)
}
fc
,
err
:=
c
.
ProfileFollowerCount
(
username
)
if
err
!=
nil
{
c
.
Scraper
.
GetGuestToken
()
// twitterscraper.GetGuestToken()
// c.Scraper = twitterscraper.New()
slog
.
Error
(
"ProfileFollowerCount"
,
"err"
,
err
.
Error
())
time
.
Sleep
(
time
.
Second
*
time
.
Duration
(
i
))
continue
}
return
fc
,
nil
}
}
func
(
c
*
Client
)
ProfileFollowerCount
(
username
string
)
(
int
,
error
)
{
if
c
.
Scraper
==
nil
{
c
.
Scraper
=
twitterscraper
.
New
()
}
//c.Scraper.GetProfile("aon_aonet")
pro
,
err
:=
c
.
Scraper
.
GetProfile
(
username
)
if
err
!=
nil
{
return
0
,
err
}
return
pro
.
FollowersCount
,
nil
}
func
(
c
*
Client
)
Retweeters
(
tweetId
string
,
next
string
)
([]
*
twitter
.
UserObj
,
string
,
*
twitter
.
RateLimit
,
error
)
{
func
(
c
*
Client
)
Retweeters
(
tweetId
string
,
next
string
)
([]
*
twitter
.
UserObj
,
string
,
*
twitter
.
RateLimit
,
error
)
{
...
...
idx.go
View file @
1ed3a384
...
@@ -2,6 +2,7 @@ package main
...
@@ -2,6 +2,7 @@ package main
import
(
import
(
"container/list"
"container/list"
"fmt"
"log/slog"
"log/slog"
"time"
"time"
...
@@ -65,9 +66,10 @@ func (s *Idx) Idx(page []UserTask) (bool, *list.List) {
...
@@ -65,9 +66,10 @@ func (s *Idx) Idx(page []UserTask) (bool, *list.List) {
match
:=
false
match
:=
false
for
ik
,
iv
:=
range
s
.
idx
{
for
ik
,
iv
:=
range
s
.
idx
{
slog
.
Debug
(
"match"
,
"idx"
,
iv
.
UserId
,
"page user id"
,
v
.
UserId
,
"page user name"
,
v
.
UserName
)
slog
.
Info
(
"match"
,
"idx"
,
iv
.
UserId
,
"page user id"
,
v
.
UserId
,
"page user name"
,
v
.
UserName
)
if
v
.
UserId
==
iv
.
UserId
{
if
v
.
UserId
==
iv
.
UserId
{
match
=
true
match
=
true
break
_
,
_
=
k
,
ik
_
,
_
=
k
,
ik
}
}
}
}
...
@@ -80,6 +82,8 @@ func (s *Idx) Idx(page []UserTask) (bool, *list.List) {
...
@@ -80,6 +82,8 @@ func (s *Idx) Idx(page []UserTask) (bool, *list.List) {
s
.
idx
=
s
.
newIdx
s
.
idx
=
s
.
newIdx
s
.
newIdx
=
make
([]
UserTask
,
0
,
10
)
s
.
newIdx
=
make
([]
UserTask
,
0
,
10
)
fmt
.
Println
(
"newList"
,
"new users"
,
newList
.
Len
())
return
true
,
newList
return
true
,
newList
}
else
{
}
else
{
...
...
syncer
View file @
1ed3a384
No preview for this file type
task.go
View file @
1ed3a384
...
@@ -74,14 +74,14 @@ func (w *Work) RunJob(t TaskJob) chan<- interface{} {
...
@@ -74,14 +74,14 @@ func (w *Work) RunJob(t TaskJob) chan<- interface{} {
cli
=
NewRetweeterClient
(
t
.
Config
)
cli
=
NewRetweeterClient
(
t
.
Config
)
}
else
if
t
.
TaskType
==
TweetLikingUsersType
{
}
else
if
t
.
TaskType
==
TweetLikingUsersType
{
cli
=
NewLikeClient
(
t
.
Config
)
cli
=
NewLikeClient
(
t
.
Config
)
}
else
if
t
.
TaskType
==
FollowType
{
cli
=
NewFollowClient
()
}
}
page
:=
NewPageUsers
(
NewIdx
(
t
.
Idx
))
page
:=
NewPageUsers
(
NewIdx
(
t
.
Idx
))
if
t
.
TaskType
==
FollowType
{
if
t
.
TaskType
==
FollowType
{
cli
:=
NewFollowerOb
()
secondTicker
:=
time
.
NewTicker
(
time
.
Second
*
3
)
secondTicker
:=
time
.
NewTicker
(
time
.
Second
*
3
)
fiveMinutesTicker
:=
time
.
NewTicker
(
time
.
Minute
*
5
)
fiveMinutesTicker
:=
time
.
NewTicker
(
time
.
Minute
*
5
)
halfHourTicker
:=
time
.
NewTicker
(
time
.
Minute
*
30
)
halfHourTicker
:=
time
.
NewTicker
(
time
.
Minute
*
30
)
...
@@ -116,7 +116,7 @@ func (w *Work) RunJob(t TaskJob) chan<- interface{} {
...
@@ -116,7 +116,7 @@ func (w *Work) RunJob(t TaskJob) chan<- interface{} {
if
maybeFound
{
if
maybeFound
{
halfHourTicker
.
Reset
(
time
.
Minute
*
30
)
halfHourTicker
.
Reset
(
time
.
Minute
*
30
)
if
err
:=
Request
(
Follower
,
page
,
t
);
err
!=
nil
{
if
err
:=
Request
(
cli
.
Follower
,
page
,
t
);
err
!=
nil
{
slog
.
Error
(
" page.Request"
,
"task id"
,
t
.
TaskId
,
"t.TaskType"
,
t
.
TaskType
,
"err"
,
err
.
Error
())
slog
.
Error
(
" page.Request"
,
"task id"
,
t
.
TaskId
,
"t.TaskType"
,
t
.
TaskType
,
"err"
,
err
.
Error
())
continue
continue
}
}
...
@@ -163,7 +163,7 @@ func (w *Work) RunJob(t TaskJob) chan<- interface{} {
...
@@ -163,7 +163,7 @@ func (w *Work) RunJob(t TaskJob) chan<- interface{} {
// if maybeFound {
// if maybeFound {
//halfHourTicker = (*time.Ticker)(time.NewTimer()) //Reset(time.Minute * 30)
//halfHourTicker = (*time.Ticker)(time.NewTimer()) //Reset(time.Minute * 30)
if
err
:=
Request
(
Follower
,
page
,
t
);
err
!=
nil
{
if
err
:=
Request
(
cli
.
Follower
,
page
,
t
);
err
!=
nil
{
slog
.
Error
(
" page.Request"
,
"task id"
,
t
.
TaskId
,
"t.TaskType"
,
t
.
TaskType
,
"err"
,
err
.
Error
())
slog
.
Error
(
" page.Request"
,
"task id"
,
t
.
TaskId
,
"t.TaskType"
,
t
.
TaskType
,
"err"
,
err
.
Error
())
continue
continue
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment