Danbooru

[Prototype] User Report Ver 6.3

Posted under General

The following is about issue #2647, i.e. making a user's report for all users.

albert left the following post on that issue about a week ago:

albert said:

Any feedback about the current report?

The report he's referring to is located at the following link: Moderator Dashboard

I'd say contrast and compare how the current report looks with the user report located on the first post in this thread.

Any feedback you have will go towards making the report more like what you want. Thanks.

@evazion

I uploaded the JSON files. The main difference is the site files that combine all of the users' tags into one object, e.g. {"1girl":20,"solo":15}.

It probably comes as no suprise that the Top 10 upload tags...

jq-win32 "to_entries | sort_by(.value) | reverse | [limit(10;.[])] | from_en
tries" uploadsitetags.json

...were the following...

{
  "1girl": 19821,
  "solo": 14897,
  "long_hair": 14012,
  "highres": 13985,
  "breasts": 10994,
  "looking_at_viewer": 10027
  "blush": 9608,
  "smile": 9533,
  "short_hair": 8121,
  "open_mouth": 8068
}

Thanks, I'll check it out. If we could filter out the gentags it might be interesting to see what the top uploaded artists/copyrights/characters are. And I've been playing around more with BigQuery; I figured out how to import your tag gardening dump from yesterday to it. Here's the link: https://bigquery.cloud.google.com/table/turing-zone-143603:danbooru.user_added_tags. A few more stats I found:

In a one month period...

  • 1774 users added a tag.
  • Of those, only 163 added more than 100 tags.
  • 15054 distinct tags were used.
  • 320160 total tags were added.
  • But the top ten taggers added 58% of those 320160 tags.

So relatively few people tag at all. And of those, only a very small group tags in any significant amount.

Hmmm... I could create modified JSONs so that they include tag type, similar to how the POSTS JSON does it....

Maybe something like..

[{"id":1,"gentags":{"solo":1},"arttags":{"nullken":10}, "copytags":{"touhou":23}, "chartags":{"pixiv-tan":4}}]

Since I can't think of any easy way to combine the different types for comparison, I'd leave the untyped versions as as they currently are as well...

Edit:

Nevermind, I just realized that...

.[] | .copytags + .chartags + .gentags + .arttags

...would combine all of the tagtypes into one.

Updated

Okay, so I imported uploadusertags.json into BigQuery here, along with a dump of the users table and the tags table. I did this in BigQuery because I'm finding it's easier for me to do this kind of analysis in SQL, since you can do things like filter by tag type, or match user IDs to names, by JOINing the tables all together into one big table.

Here are the results:

Top Artists Uploaded

https://docs.google.com/spreadsheets/d/1XyuSUwxXOqlguTF_Lavdw20fUGWROVg__Vbm-mBfHUs/edit?usp=sharing

SELECT
  tags_used.id AS id,
  users.name AS name,
  users.level_string AS level,
  tags.name as tag_name,
  tags.category as tag_type,
  tags_used.tags.count AS tag_count
FROM FLATTEN([turing-zone-143603:danbooru.user_upload_tags], tags) AS tags_used
JOIN [turing-zone-143603:danbooru.tags]  AS tags  ON tags_used.tags.name = tags.name
JOIN [turing-zone-143603:danbooru.users] AS users ON tags_used.id        = users.id
WHERE tags.category = 1
GROUP BY id, name, level, tag_name, tag_type, tag_count
ORDER BY tag_count DESC
LIMIT 15000
Top Characters Uploaded

https://docs.google.com/spreadsheets/d/1h3DMwaRK1FnCCSJpL1FJ7E8ucL7uRSAKbwEGmqs8BUI/edit?usp=sharing

SELECT
  tags_used.id AS id,
  users.name AS name,
  users.level_string AS level,
  tags.name as tag_name,
  tags.category as tag_type,
  tags_used.tags.count AS tag_count
FROM FLATTEN([turing-zone-143603:danbooru.user_upload_tags], tags) AS tags_used
JOIN [turing-zone-143603:danbooru.tags]  AS tags  ON tags_used.tags.name = tags.name
JOIN [turing-zone-143603:danbooru.users] AS users ON tags_used.id        = users.id
WHERE tags.category = 4
GROUP BY id, name, level, tag_name, tag_type, tag_count
ORDER BY tag_count DESC
LIMIT 15000
Top Copyrights Uploaded

https://docs.google.com/spreadsheets/d/1w9mC_i3cLhq8bI41D_Q2WhEcPWuxFdYrjvePmNau8aQ/edit?usp=sharing

SELECT
  tags_used.id AS id,
  users.name AS name,
  users.level_string AS level,
  tags.name as tag_name,
  tags.category as tag_type,
  tags_used.tags.count AS tag_count
FROM FLATTEN([turing-zone-143603:danbooru.user_upload_tags], tags) AS tags_used
JOIN [turing-zone-143603:danbooru.tags]  AS tags  ON tags_used.tags.name = tags.name
JOIN [turing-zone-143603:danbooru.users] AS users ON tags_used.id        = users.id
WHERE tags.category = 3
GROUP BY id, name, level, tag_name, tag_type, tag_count
ORDER BY tag_count DESC
LIMIT 15000

These tables show which people are the top uploaders for which things. So for example, we can see that Dbx was the top hatsune miku uploader, Qpax was the top overwatch uploader, Sacriven was the top touhou uploader, c-button was the most uploaded artist, etc.

Ah, that's pretty cool. I figured I was the top Girls und Panzer uploader.

This all got me thinking though about supply vs demand, and so I took the data from Popular Searches and compiled the following table:

Show
RankTagnameTypeSearchesUploadsSearches/Uploads
1as109Artist64920inf
2null_(nyanpyoun)Artist903724518.5
3himura_kisekiArtist562441406.0
4otayamaArtist575251150.4
5ama_mitsukiArtist72878910.87
6houtengekiArtist1123118623.94
7oda_nonArtist661311601.18
8felix_argyleCharacter938221446.76
9monster_musume_no_iru_nichijouCopyright631318350.72
10ishikeiArtist587018326.11
11high_school_dxdCopyright660126253.88
12zhengArtist656528234.46
13bestialityGeneral609526234.42
14lusamine_(pokemon)Character1612976212.22
15futanariGeneral1154164180.32
16lusamineNonexistant945657165.89
17rwbyCopyright1020562164.59
18hammer_(sunset_beach)Artist888055161.45
19vicke_(pokemon)Character1006765154.87
20league_of_legendsCopyright1502097154.84
21monster_girl_encyclopediaCopyright834155151.65
22yua_(checkmate)Artist773452148.73
23rapeGeneral759856135.67
24murakami_suigunArtist656649134.0
25new_game!Copyright13998128109.35
26animatedGeneral18211168108.39
27iowa_(kantai_collection)Character14340137104.67
28scathach_(fate/grand_order)Character1027099103.73
29dandon_fugaArtist562555102.27
30warspite_(kantai_collection)Character2549126496.55
31kouji_(campus_life)Artist83918994.28
32bismarck_(kantai_collection)Character61796693.62
33female_protagonist_(pokemon_go)Character980911684.56
34bondageGeneral1056513081.26
35emilia_(re:zero)Character78729781.15
36mei_(overwatch)Character76029679.18
37animated_gifGeneral68898878.28
38tsunakoArtist57117378.23
39bdsmGeneral1234316077.14
40neptune_(series)Copyright1118515174.07
41hamakaze_(kantai_collection)Character1024515167.84
42strike_witchesCopyright58038865.94
43djeeta_(granblue_fantasy)Character57168765.7
44kashima_(kantai_collection)Character945414963.44
45d.va_(overwatch)Character1501624162.3
46mercy_(overwatch)Character1008816959.69
47prinz_eugen_(kantai_collection)Character627510659.19
48uncensoredGeneral886615158.71
49graf_zeppelin_(kantai_collection)Character608410557.94
50overwatchCopyright3853972053.52
51re:zero_kara_hajimeru_isekai_seikatsuCopyright2496849450.54
52caster_(fate/extra)Character566611449.7
53haruna_(kantai_collection)Character612112548.96
54otoko_no_koGeneral770616147.86
55rem_(re:zero)Character1562032947.47
56houshou_(kantai_collection)Character565012545.2
57i-26_(kantai_collection)Character984722244.35
58saberCharacter592714142.03
59monster_girlGeneral746618340.79
60danganronpaCopyright865521839.7
61z3_max_schultz_(kantai_collection)Character643317836.14
62paizuriGeneral587616336.04
63love_live!_sunshine!!Copyright1277135935.57
64hibiki_(kantai_collection)Character642118235.28
65tentaclesGeneral579217034.07
66sexGeneral2122163033.68
67pokemon_smCopyright1384341333.51
68cum_in_pussyGeneral881026832.87
69pokemonCopyright35366108032.74
70huge_breastsGeneral1397943731.98
71pokemon_goCopyright669321031.87
72feetGeneral775524431.78
73girls_und_panzerCopyright2553482131.1
74fate/grand_orderCopyright2133869930.52
75yuriGeneral1746557630.32
76granblue_fantasyCopyright1869762929.72
77loliGeneral704624229.11
78kongou_(kantai_collection)Character648924626.37
79hatsune_mikuCharacter849335723.78
80fate_(series)Copyright2162193923.02
81kaga_(kantai_collection)Character609028721.21
82kantai_collectionCopyright101682564018.02
83love_live!Copyright1015063815.9
84touhouCopyright56271398914.1
85idolmaster_cinderella_girlsCopyright1074094411.37
86cumGeneral685563310.82
87pussyGeneral90319139.89
88idolmasterCopyright1086612498.69
89translatedGeneral67849417.2
90nudeGeneral738512046.13
91assGeneral1066819985.33
92pantyhoseGeneral633712385.11
93nipplesGeneral774020763.72
94large_breastsGeneral1308841863.12
95originalCopyright1026034272.99
96pantiesGeneral585922612.59
97thighhighsGeneral575237921.51
98breastsGeneral14475109941.31
991girlGeneral10246198210.51

It's not surprising that most of the top spots are artists, as their output would be on average much lower than a character or copyright.

Sacriven said:

OOT, but anyone knows why Provence deleting himself? :/

BrokenEagle98 said:

No idea... so that's what an account looks like after it's deleted...? I wonder if it was just a mistake? I remember a few months back he momentarily changed his name, only to change it back again...

Looks like account deletion to me. The account name is a generic string and all favorites have been removed.

It can be undeleted up until the moment it gets purged, although I don't know what the timeout for that is...? Even then it might be able to be restored if there are regular periodic backups to the Danbooru data that could be pulled from. Otherwise he'd have to start up a new account...

BrokenEagle98 said:

It can be undeleted up until the moment it gets purged, although I don't know what the timeout for that is...? Even then it might be able to be restored if there are regular periodic backups to the Danbooru data that could be pulled from. Otherwise he'd have to start up a new account...

Didn't find anything that indicates a timer based account purge.

The Ruby code in danbooru/app/logical/user_deletion.rb does the following:

  • validate (validate given password)
  • clear_user_settings
  • remove_favorites
  • clear_tag_subscriptions
  • rename (replace user name with user id)
  • reset_password
  • create_mod_action (report for mods?)

This means that a deleted account continues to exist, but the password is changed to something random.

(Sorry for abusing this thread.)

It can be undeleted by albert, by restoring password hash from the backup DB, but requesting that after deleting the account yourself would be pretty bold. Either way, vanishing without saying a word, mid-discussion (he sent me a dmail prompting for response hours before) seems pretty strange, if not stupid. Whatever the circumstances, you can spend 30 seconds and say that you quit before deleting the account.

Type-kun said:

It can be undeleted by albert, by restoring password hash from the backup DB, but requesting that after deleting the account yourself would be pretty bold. Either way, vanishing without saying a word, mid-discussion (he sent me a dmail prompting for response hours before) seems pretty strange, if not stupid. Whatever the circumstances, you can spend 30 seconds and say that you quit before deleting the account.

He might have been hacked and someone deleted him out of spite.

I kind of wish we had two-factor authentication, but I'm not sure how it'd be managed.

Jarlath said:

He might have been hacked and someone deleted him out of spite.

I kind of wish we had two-factor authentication, but I'm not sure how it'd be managed.

I contacted Provence to find out what happened.

A moderator or admin could meanwhile check his account's IP history for irregularities. If the last recorded IP address was a non German one, this could be a good indicator for unauthorized account activity.

reiyasona said:

I contacted Provence to find out what happened.

A moderator or admin could meanwhile check his account's IP history for irregularities. If the last recorded IP address was a non German one, this could be a good indicator for unauthorized account activity.

Wait, you have Provence's contact? So you're his collaborator all this time? xD
That aside, I'm agree that this is strange. His last activities didn't show any sign of quitting, after all.

Sacriven said:

Wait, you have Provence's contact? So you're his collaborator all this time? xD
That aside, I'm agree that this is strange. His last activities didn't show any sign of quitting, after all.

Well ... yeah, we have been working together since the introduction of the medium_breasts tag (see forum #116365 -> press "Show").

I have sent him a message on Pixiv.

Updated

Type-kun said:
but requesting that after deleting the account yourself would be pretty bold.

This guy did it, so I'd guess it's not so bold. Especially if it's some external cause.

reiyasona said:
A moderator or admin could meanwhile check his account's IP history for irregularities. If the last recorded IP address was a non German one, this could be a good indicator for unauthorized account activity.

On a rather stacked list of IP adresses by their name, none seem to be not following some recursive patterns (and there are 4-5 specific patterns in there). However, it's not out of question that the deletion might NOT be a recorded action for that purpose (and neither is account creation, this one I'm sure of, for comparison's sake).

1 2 3 4 5 6 7 8 9 10 15