Getting bpy.ops.anim.copy_driver_button() working
Okay this is a fairly simple solution then, I'm going to point you there instead of answer it yet, because I'm on my phone and not in front of blender (I will have to circle back around on this). 

You need to get into the animation_data of your objects. This has driver, expression, and variable properties within. The big tip here is that you need to create a new variable before the expression will actually work. To get at these it's going to be something like:

bpy.data.objects["Cube"].animation_data



Here is a quick append to this answer for now to help you understand the data structure. However before you copy and apply this data to another object there is more to prepare on the "OTHER" object.

Still planning on circling back around on this to finalize this lacking part of the answer.

c1 = bpy.data.objects["C1"]
# This is the reference to my Original Cube with the Driver

dr1 = c1.animation_data.drivers
# This is the Driver collection of my Original Cube

dr1[0].data_path
# This returns 'scale'

dr1[0].expression
# This simply returns my expression 'var', because I am using a 1:1 mapping of another object's scale factor

dr1[0].driver.variables[0].name
# This returns the first (and only in this case) variable that I have named in this driver 'var'

dr1[0].driver.variables.items()[0][1].targets.items()[0][1].transform_type
# Returns 'SCALE_X'

dr1[0].driver.variables.items()[0][1].targets.items()[0][1].transform_space
# Returns 'WORLD_SPACE'




Without being able to confirm this yet, I'm going to recommend that you explore the following approach to get the copy:

For the sake of my code above, please follow my case (ultimately it should follow suit in yours).

I'm going to reference a second Cube whose name is "C2".

CONFIRMED

So for the prep on this object, before you can copy the data try:

c2 = bpy.data.object["C2"]

#If you were to create it manually -&gt; c2.driver_add('scale', 0)
#Since you are copying do something like:

dr2_path = dr1[0].data_path
dr2_index = dr1[0].array_index
c2.driver_add(dr2_path, dr2_index)

#Now get reference to your new driver &amp; Create a new Variable
dr2 = c2.animation_data.drivers
dr2[0].driver.variables.new()
#by default this should be 'var' if this is the 1st.
#You should now be able to copy the expression, target, etc... over from c1

dr2[0].driver.variables.items()[0][1].type = dr1[0].driver.variables.items()[0][1].type
dr2[0].driver.variables.items()[0][1].targets.items()[0][1].id = dr1[0].driver.variables.items()[0][1].targets.items()[0][1].id
dr2[0].driver.variables.items()[0][1].targets.items()[0][1].data_path = dr1[0].driver.variables.items()[0][1].targets.items()[0][1].data_path
dr2[0].driver.variables.items()[0][1].targets.items()[0][1].transform_type = dr1[0].driver.variables.items()[0][1].targets.items()[0][1].transform_type
dr2[0].driver.variables.items()[0][1].targets.items()[0][1].transform_space = dr1[0].driver.variables.items()[0][1].targets.items()[0][1].transform_space




Here's the proof of the rest of this code in play: