pythondjangoimageforumsignature

Creating a dynamic forum signature generator in python


I have searched and searched but I have only found solutions involving php and not python/django. My goal is to make a website (backend coded in python) that will allow a user to input a string. The backend script would then be run and output a dictionary with some info. What I want is to use the info from the dictionary to sort of draw it onto an image I have on the server and give the new image to the user. How can I do this offline for now? What libraries can I use? Any suggestions on the route I should head on would be lovely.

I am still a novice so please forgive me if my code needs work. So far I have no errors with what I have but like I said I have no clue where to go next to achieve my goal. Any tips would be greatly appreciated.

This is sort of what I want the end goal to be http://combatarmshq.com/dynamic-signatures.html

This is what I have so far (I used beautiful soup as a parser from here. If this is too excessive or if I did it in a not so good way please let me know if there is a better alternative. Thanks):

The url where I'm getting the numbers I want (These are dynamic) is this: http://combatarms.nexon.net/ClansRankings/PlayerProfile.aspx?user=

The name of the player will go after user so an example is http://combatarms.nexon.net/ClansRankings/PlayerProfile.aspx?user=-aonbyte

This is the code with the basic functions to scrape the website:

from urllib import urlopen
from BeautifulSoup import BeautifulSoup

def get_avatar(player_name):
    '''Return the players avatar as a binary string.'''
    player_name = str(player_name)
    url = 'http://combat.nexon.net/Avatar/MyAvatar.srf?'
    url += 'GameName=CombatArms&CharacterID=' + player_name
    sock = urlopen(url)
    data = sock.read()
    sock.close()
    return data

def save_avatar(data, file_name):
    '''Saves the avatar data from get_avatar() in png format.'''
    local_file = open(file_name + '.png', 'w' + 'b')
    local_file.write(data)
    local_file.close()

def get_basic_info(player_name):
    '''Returns basic player statistics as a dictionary'''
    url = 'http://combatarms.nexon.net/ClansRankings'
    url += '/PlayerProfile.aspx?user=' + player_name
    sock = urlopen(url)
    html_raw = sock.read()
    sock.close()
    html_original_parse = BeautifulSoup(''.join(html_raw))
    player_info = html_original_parse.find('div', 'info').find('ul')
    basic_info_list = range(6)
    for i in basic_info_list:
        basic_info_list[i] = str(player_info('li', limit = 7)[i+1].contents[1])
    basic_info = dict(date = basic_info_list[0], rank = basic_info_list[1], kdr = basic_info_list[2], exp = basic_info_list[3], gp_earned = basic_info_list[4], gp_current = basic_info_list[5])
    return basic_info

And here is the code that tests out those functions:

from grabber import get_avatar, save_avatar, get_basic_info

player = raw_input('Player name: ')
print 'Downloading avatar...'
avatar_data = get_avatar(player)
file_name = raw_input('Save as? ')
print 'Saving avatar as ' + file_name + '.png...'
save_avatar(avatar_data, file_name)
print 'Retrieving ' + player + '\'s basic character info...'
player_info = get_basic_info(player)
print ''
print ''
print 'Info for character named ' + player + ':'
print 'Character creation date: ' + player_info['date']
print 'Rank: ' + player_info['rank']
print 'Experience: ' + player_info['exp']
print 'KDR: ' + player_info['kdr']
print 'Current GP: ' + player_info['gp_current']
print ''
raw_input('Press enter to close...')

Solution

  • If I understand you correctly, you want to get an image from one place, get some textual information from another place, draw text on top of the image, and then return the marked-up image. Do I have that right?

    If so, get PIL, the Python Image Library. Both PIL and BeatifulSoup are capable of reading directly from an opened URL, so you can forget that socket nonsense. Get the player name from the HTTP request, open the image, use BeautifulSoup to get the data, use PIL's text functions to write on the image, save the image back into the HTTP response, and you're done.