If 42 is the answer, I have found my question [Farewell]

Maybe the locking is the service that we’re paying for? Possibly? I mean, my understanding is that the level designations of each “radical”, kanji, and vocab are what set WK apart from everything else. So…WK’s level information, the 5-item lesson groupings, and the order in which WK presents the 5-item grouping, as long as these things are exclusive to paying subscribers, maybe this is just a bigole bucket of basic study material minus all the important study armature that makes it work so well?

I could imagine things to explain a situation where something like this would be ok…


Agreed. I’ve just flagged the thread, with a note for WK staff to take a look at it.


Thank you.

I’m always happy to talk about methodology, if anyone is interested in discussing that.


Interested in talking about availability of content to people who download your code and then stop paying WK for access. Does it let people do that, or do people have to have an active API key continuously in order for your code to function?

[I think that’s the worry people are having (including me…), and I think that if WK staff gives it the explicit ok you’ll certainly be in better shape legally speaking than if they didn’t look at it or notice it and they end up losing money and you end up on the hook for that… :grimacing: And if they do that, then the doors fling even wider for people to do more amazingness like you’ve just done! I can imagine infinite (and pretty unlikely) ways this could go either way, and I want you to have the best opportunity for it to go well! Because this *is* really neat, provided it’s legal and WK has no problem with it that could cause them to tighten up their EULA and then come at ya.[I mean heck, tbh this is really neat even if it’s *not* legal and/or the :crabigator: isn’t cool with it…]]



Python wrappers!!! 教えてください。How the heck does that sh*t work?! lol I was freaking out about the thing that lets you pass different numbers of arguments to functions or something, even different data types if I remember correctly…something using * or something…that kind of stuff is what makes Python great! Tastiest spams in the universe!

Seriously though, could you talk a bit about function wrappers to me?? Links to the pep is fine too…I’m not so lazy that I hadn’t looked at that stuff, but it was waaayyyyy not understandable to me at that time…

[update: ohhhhh myyyyy gaaaaahhhhhhsh that sht’s terrifying and amazing i miss my office job]

1 Like

Right, if it were just that it would obviously be very different.

However if you take a look at what the code exports, it rips all of the proprietary mnemonics and level data as well. Hell it even rips the color coordination of the items. I actually flagged it to be looked at as well right after my initial reply, so ultimately I think the mods will be popping in at some point. They’re more knowledgeable than I am and have the authority, so I’ll stop bogging the thread down with my nonsense.

That being said if I’m understanding how the code works properly I have to disagree fundamentally with the decision @orphen made when posting it.


Thanks for looking at it and sharing what you see there. Glad it was intelligibly-written too…I guess people can make it not, so this is something nice.

Thinking about what’s in WK’s EULA and why, maybe they’ve got some kind of sharing agreement with jisho.org that prevents them from explicitly cordoning off certain kinds of content that they’re using…?

Sorry. Every word I type here is probably karmically shortening my life by 5 minutes.

@orphen waiting with baited breath as you type that reply – and no matter what, I want to say this: I am sorry for my part in this if things work out terribly for you in any way whatsoever. The amount of labor you’ve put in on this, it’s just incredible. And I really wish for this to go well, for everyone. The amount of labor WK puts in too…it boggles the mind…but for someone to write something this mega on their own is always causing me to feel super super respect for them. So many users have brought so much to the table, and shared their work freely and beautifully. I use Tsurukame, and that thing is magnificent and I am stoplessly stunned by its existence.


That’s a really awesome and useful tool and I appreciate how long it must have taken to produce but the morality of it is somewhat cloudy to me. Would there be a way to modify the tool so that only those with a lifetime subscription would be able to pull the data from Wanikani? Even then what would stop them from then sharing or even selling that content to others?

1 Like

I’d say this is in part a matter of what WaniKani allows using their API.

I’m not even at level 30 yet, but I’ve used WaniKani’s API to download the full database. I use it to extract WaniKani data from higher level kanji to include on my Anki cards when sentence mining.

As long as WaniKani’s API allows this, there’s nothing to stop someone with a little programming know-how from accessing the full database.

It’s certainly murky territory when one releases tools that make certain uses of the API.

(Side-note: I’m neither arguing for nor against any position.)


Sorry, my note on methodologies was toward everyone, not trying to direct you away from this discussion. To be frank, no response of mine is likely satisfactory here. More authoritative than my promise of what the code does is what the code actually does. Let’s just wait on the staff.

Haha, I was referring to language-learning methodology, but yes, I’m happy to discuss software too! Assuming you’re talking about something like this, it’s a design pattern, and basically what it does is make a forwarding function that calls the function you provide but first calls another user-defined function pre() and then afterward a final user-defined function post().

Toy example using wrap as defined in the link; if I had

def wrap(pre, post):
    def decorate(func):
        def call(*args, **kwargs):
            pre(func, *args, **kwargs)
            result = func(*args, **kwargs)
            post(func, *args, **kwargs)
            return result
        return call
    return decorate

def noop(*args):

def assert_len_ok(_, num_items: int):
    assert(num_items >= 0)

def make_list(num_items: int):
    return [0] * num_items

wrapper = wrap(assert_len_ok, noop)
make_list_wrapper = wrapper(make_list)
my_list = make_list_wrapper(-1) # Whoops.

I could define assert_len_ok() to check that make_list() wasn’t passed an invalid argument, in the context of this code. It’s a toy–you’d typically do more sophisticated work with it. It’s also rather convoluted, so from a complexity standpoint it requires strong justification over your typical unwrapped assert() calls.

*args allows for handling an unknown number of arguments (called being “variadic”) and **kwargs is for named (“keyword”) arguments.

Thank you for taking time to read the source as part of your decision.

1 Like

Could you clarify, please? The code only automatically fetches what is available via the API, and I don’t remember this being there.

1 Like

Let me clarify how I’m reaching my conclusions first and foremost.

I am in no way a programmer, and all knowledge I have of code is remnants of the 2 years of computer science I took in High School 10 years ago. This is why I’ve said “If I’m understanding correctly” in several of my replies, as it’s entirely possible I’m not. I’m going off of a combination of your explanation of the tool and how you’ve used it, screenshots from your github page, and only a tiny fraction based off of the code itself.

In the screenshots on your github page, it shows a screenshot of a near carbon copy of the WaniKani card for the vocab item 九 down to the purple. If this was something you designed manually, then I admit my mistake in that regard. I’d assumed that the card is generated in that exact format for every WaniKani item as long as they follow your instructions appropriately.
Is this not the case?


Just to clarify (since I didn’t see it posted), the whole WK content is free to access without subscription. I just opened a random level 14 item while logged out in a private window, and it’s all there:

So, you don’t need to pay anything if you want to take the content.
The thing we are paying for is the SRS (and the lesson screen I guess).


To be frank, I am the only person who gets to declare what, as an answer, would be satisfying to me… lol… but yes, I’m sure that WK will need to evaluate the truth value based on the actual functions of your code.

As for a satisfactory answer, I personally would be totally satisfied with a direct statement such as: “No – my code does not make available to non-paying WK users content that WK has blocked them from accessing directly through WK.”


“Yes, my code provides content that is accessible to non-paying users, but WK doesn’t prevent this in any way – non-paying users can get all of this for free even before they pay for their first month” or some such helpful information.

Thanks! I looked it up and it blew my mind! :smiley: And yes, *args and **kwargs were the delightful things that I remembered from my “school days” trying to make my life easier at my job…

Thank you for taking time to reply! <3


“I don’t like your attitude, sir” << my feeling, just because how hard is it to just say, “Yes, I made code that retrieves stuff so that I can, effectively, keep using WK for free and stop paying them for access”?

Sorry for my lip here, but dang that came across as evasive and supercilious.

1 Like

Stunned!!! Thank you for this!

@orphen : wish you had stated this yourself…I think knowing the extent of what’s available would’ve cleared this up instantly for us non-programmer types.

Also sorry for my static but people telling me what wouldn’t satisfy me as an answer to a question I asked, and then refusing to answer my question…always rubs me the wrong way. It looks like evasiveness trying to use full-of-it-ness to legitimize itself…which is so understandable if you got scared from getting an unexpected third degree from a bunch of users after posting something awesome and labor-intensive. Sorry for the stress.

1 Like

Excellent – so it’s just as I thought! We are paying for the progressive unlocking functionality. :slight_smile: That’s excellent!

Very grateful that @orphen’s in good stead!

1 Like

I had totally forgotten this was a thing.

Which brings me to a new question, can the process be automated as @orphen has seemingly done without an API? Ultimately doesn’t change the outcome, but for some reason still sits funny with me.

1 Like

(is it possible your browser had saved or cached this and/or your login info?)

Thanks for explaining. No harm, no foul!

Indeed, the cards you see here and in my repo are styled manually by me in Anki, not by my tools. What you see (in Anki) is not what you get just by using the tool. You’d have to style it yourself.


Yes. You can just iterate through all the pages (either with a script or manually) and take all the content. :woman_shrugging:

No, it was a fresh private browsing window. Also they made a public announcement about making the whole content public a while ago.

Yes, I saw that as well from checking the code. You might want to show what it looks without additional styling (so that at the very list users of your code aren’t surprised by the difference) and maybe use a different color scheme for your advanced example (regardless of what you do on your own computer).